codeforces 246D. Colorful Graph

题意:一个图中,每个点被染成不同的颜色。同颜色的点构成集合中的等价类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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值