• [BZOJ-1006&洛谷P3196][HNOI2008]神奇的国度--【图的染色-最大势MCS算法】


    洛谷:时间限制1.00s 内存限制125.00MB

    Time Limit: 20 Sec  Memory Limit: 162 MB

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1006

    洛谷:https://www.luogu.com.cn/problem/P3196

    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)


    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
    ",ans);
        return 0;
    }
    路漫漫兮
  • 相关阅读:
    Docker
    docker
    Go
    Docker4Windows -- 从外部(非本机host)访问 由docker container运行的程序
    Unable to resolve target 'android-9'
    win7中VS2010中安装CSS3.0问题解决方法
    修改vs2005,vs2008,vs2010调试默认浏览器
    Android SDK Content loader has encountered a problem” “parseSdkContent Failed ”
    解决parseSdkContent failed java.lang.NullPointerException错误
    50个Android开发人员必备UI效果源码[转载]
  • 原文地址:https://www.cnblogs.com/lonely-wind-/p/12191171.html
Copyright © 2020-2023  润新知