题意:一个图中,每个点被染成不同的颜色。同颜色的点构成集合中的等价类v(k),k为颜色的种类。现在又有一个集合q(k),代表某一个点的颜色为K,在它周围与它不同色的点。
这里要注意的是1----2----3,当1,3的颜色相同时,不能重复计算2,因为是集合。如此下来,算出基数最小的集合q(k)。
做法:用set模仿集合可以很好的解决重复问题
#include <set>
#include<iostream>
#include<cstdio>
#include<set>
#define LMT 1000005
//size()取出的为无符号整数
using namespace std;
set<int>q[LMT];
bool have[LMT];
int c[LMT],n,m;
int main(void)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
q[i].clear();
int x;
scanf("%d",&x);
c[i]=x;
have[x]=1;
}
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
if(c[a]!=c[b])
{
q[c[a]].insert(c[b]);
q[c[b]].insert(c[a]);
}
}
int tem=-1,ans;
for(int i=1;i<LMT;i++)
if(have[i]&&tem<(int)q[i].size())
{
tem=q[i].size();
ans=i;
}
printf("%d\n",ans);
return 0;
}