Description
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,CD,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
1 2
1 4
2 4
2 3
3 4
Sample Output
3
HINT
一种方案(1,3)(2)(4)
Source
这道题题意十分清晰。
就是用最少颜色给整个图染色使得相邻两个点之间的颜色不相同。
WC2009 cdq的讲稿中提到了这个问题:
http://wenku.baidu.com/link?url=gMlf2JA_ntdwxYgyTmd--5SjZJmy4UOmNqytRHB1KJer8JjQE2jgFCSOm5pH3rhArBnlA-d-ApYkeSI8JnEoHx0x6Diwuu1_NtAd0vtKwxu
还有一个问题 到现在依然没懂,望神犇解答
然而关于相关问题的证明,我们伟大的黄学长给了我一个博客。解释的十分清除:
http://ydcydcy1.blog.163.com/blog/static/21608904020142673343164/
那么当你看了两个东西之后相信就不用我这里再多说了。
#include <bits/stdc++.h>
#define N 10010
#define M 2000010
using namespace std;
int tot,n,m,d[N],vis[N],Hash[N],col[N],Q[N],head[N],next[M],v[M];
inline int max(int a, int b)
{
if(a > b) return a;
else return b;
}
void ins(int a,int b)
{
v[++ tot] = b;
next[tot] = head[a];
head[a] = tot;
}
void insert(int a, int b)
{
ins(a, b);
ins(b, a);
}
int main()
{
int a,b,ans;
scanf("%d%d",&n,&m);
tot = 0;
memset(head,0,sizeof head);
for (int i = 0; i < m; i ++)
{
scanf("%d%d",&a,&b);
insert(a, b);
}
memset(vis,0,sizeof vis);
memset(d,0,sizeof d);
d[0] = -1;
for (int i = n; i; i --)
{
int j, k;
for (k = 0, j = 1; j <= n; j ++)
if (!vis[j] && d[j] > d[k]) k = j;
vis[k] = i;
Q[i] = k;
for (j = head[k]; j; j = next[j]) d[v[j]] ++;
}
memset(col,0,sizeof col);
ans=0;
for (int i = n; i; i --)
{
int k = Q[i];
for (int j = head[k]; j; j = next[j])
Hash[col[v[j]]] = i;
int j;
for (j = 1; ; j ++)
if (Hash[j] != i)
break;
col[k] = j;
ans = max(ans, j);
}
printf("%d\n",ans);
return 0;
}