BZOJ P1006: [HNOI2008]神奇的國度
題目
Description
K國是一個熱衷三角形的國度,連人的交往也只喜歡三角原則.他們認爲三角關係:即AB相互認識,BC相互認識,CA
相互認識,是簡潔高效的.爲了鞏固三角關係,K國禁止四邊關係,五邊關係等等的存在.所謂N邊關係,是指N個人 A1A2
…An之間僅存在N對認識關係:(A1A2)(A2A3)…(AnA1),而沒有其它認識關係.比如四邊關係指ABCD四個人 AB,BC,C
D,DA相互認識,而AC,BD不認識.全民比賽時,爲了防止做弊,規定任意一對相互認識的人不得在一隊,國王相知道,
最少可以分多少支隊。
Input
第一行兩個整數N,M。1<=N<=10000,1<=M<=1000000.表示有N個人,M對認識關係. 接下來M行每行輸入一對朋
友
Output
輸出一個整數,最少可以分多少隊
Sample Input
4 5
1 2
1 4
2 4
2 3
3 4
Sample Output
3
HINT
一種方案(1,3)(2)(4)
題解
一道圖論題目(題目開始嗶了半天,好像最後一點卵用都沒有)
最大勢算法
每次把與當前點相鄰的點的入度加1,然後尋找一個當前入度最大的點作爲下次擴展的點
(不知道說的對不對。。。),因爲,以當前入度最大的點爲下一次擴展的點可以保證它下一次選擇的點的度數儘量小(這裏的入度就是染色的顏色總數(應該是這樣的吧,表示論文沒看懂。。。))
代碼
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,tot,now,ans;
int lnk[10005],t[10005];
bool vis[10005];
struct edge
{
int nxt,y;
} e[2000005];
int readln()
{
int x=0;
char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9') x=x*10+ch-48,ch=getchar();
return x;
}
void add(int x,int y)
{
tot++;e[tot].nxt=lnk[x];lnk[x]=tot;e[tot].y=y;
}
int max(int x,int y){return x>y?x:y;}
int main()
{
n=readln();m=readln();
for (int i=1;i<=m;i++)
{
int x=readln(),y=readln();
add(x,y);add(y,x);
}
memset(t,0,sizeof(t));
memset(vis,false,sizeof(vis));
t[0]=-1;
for (int i=1;i<=n;i++)
{
now=0;
for (int j=1;j<=n;j++) if (!vis[j]&&t[now]<t[j]) now=j;
vis[now]=true;
for (int j=lnk[now];j;j=e[j].nxt) if (!vis[e[j].y]) t[e[j].y]++;
}
for (int i=1;i<=n;i++) ans=max(ans,t[i]);
printf("%d",ans+1);
return 0;
}