K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA
相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2
...An之间仅存在N对认识关系:(A1A2)(A2A3)...(AnA1),而没有其它认识关系.比如四边关系指ABCD四个人 AB,BC,C
D,DA相互认识,而AC,BD不认识.全民比赛时,为了防止做弊,规定任意一对相互认识的人不得在一队,国王相知道,
最少可以分多少支队。
第一行两个整数N,M。1<=N<=10000,1<=M<=1000000.表示有N个人,M对认识关系. 接下来M行每行输入一对朋
友
一种方案(1,3)(2)(4)
emmm,画个图看看就知道它要求的是图的最小染色问题,对于一个图染色,相邻的点颜色不一样,问最少可以用多少种颜色。
这里有个最大势算法,其具体过程如下:
1.刚开始的每个点的势为0,任意取出一个点删除。
2.将与删除点相连的点的势+1,取出最大势的点删除。
3.重复操作2,直到所有的点都被删除。
那么就会有一个删除序列,而这个删除序列中出现了多少种不同的势,那么最小的颜色数就是多少。
在洛谷的话第二个测试点会被卡时间,开个氧气优化就好了,BZOJ没这个问题。
以下是AC代码:
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int mac=1e6+10;
const int mac2=1e4+10;
struct node
{
int to,next,w;
}eg[mac<<1];
int head[mac2],cnt=0,vis[mac2],color[mac2],point[mac2];
struct pot
{
int val,id;
bool operator <(const pot&a)const{
return val<a.val;
}
};
void add(int u,int v)
{
eg[++cnt]=node{v,head[u],0};
head[u]=cnt;
}
int main()
{
int n,m;
scanf ("%d%d",&n,&m);
memset(head,-1,sizeof head);
for (int i=1; i<=m; i++){
int u,v;
scanf ("%d%d",&u,&v);
add(u,v);add(v,u);
}
priority_queue<pot>q;
q.push(pot{0,1});
int ans=0;
while (!q.empty()){
pot now=q.top();
q.pop();
if (vis[now.id]) continue;
vis[now.id]=1;
int u=now.id;
if (!color[now.val]) ans++,color[now.val]=1;
for (int i=head[u]; i!=-1; i=eg[i].next){
int v=eg[i].to;
if (vis[v]) continue;
point[v]++;
q.push(pot{point[v],v});
}
}
printf("%d\n",ans);
return 0;
}