zoukankan      html  css  js  c++  java
  • bzoj1006 神奇的国度

    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

    输出一个整数,最少可以分多少队

    MCS算法(每次选一个与最多已标号点相邻的点进行标号,标号顺序的逆序即为完美消除序列)求弦图的完美消除序列,

    并逆序贪心染色,每次染与相邻已染色结点不同的颜色中最小编号的颜色,染色所用颜色数即为答案

    时间复杂度O(n+m)

    #include<cstdio>
    int n,m,a,b;
    int es[2050000],ep=10001;
    int enx[2050000];
    int ss[20005],ls[20005],rs[20005];
    int id[10005],f[10005],col[10005],cols[10005];
    int h[10005];
    int mx=0,mxc=0;
    inline void addedge(int a,int b){
        es[ep]=b;
        enx[ep]=enx[a];
        enx[a]=ep++;
        es[ep]=a;
        enx[ep]=enx[b];
        enx[b]=ep++;
    }
    inline void del(int w){
        w+=10000;
        rs[ls[w]]=rs[w];
        ls[rs[w]]=ls[w];
    }
    inline void add(int w,int x){
        w+=10000;
        rs[w]=rs[x];
        ls[w]=x;
        ls[rs[x]]=w;
        rs[x]=w;
    }
    inline int read(){
        int x=0;
        char c=getchar();
        while(c>'9'||c<'0')c=getchar();
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x;
    }
    int main(){
        n=read(),m=read();
        for(int i=1;i<=n;i++)ls[i]=rs[i]=i;
        for(int i=1;i<=n;i++)add(i,0);
        for(int i=1;i<=m;i++){
            a=read(),b=read();
            addedge(a,b);
        }
        for(int i=1;i<=n;i++){
            while(rs[mx+1]!=mx+1)++mx;
            while(mx&&rs[mx]==mx)--mx;
            int c=rs[mx]-10000;
            f[id[c]=i]=c;
            del(c);
            int e=c;
            while(e=enx[e]){
                int u=es[e];
                ++h[u];
                if(!id[u])del(u),add(u,h[u]);
            }
        }
        for(int i=1;i<=n;i++){
            int c=f[i];
            int e=c;
            while(e=enx[e])cols[col[es[e]]]=i;
            int cn=1;
            while(cols[cn]==i)++cn;
            col[c]=cn;
            if(cn>mxc)mxc=cn;
        }
        printf("%d",mxc);
        return 0;
    }
  • 相关阅读:
    JavaScript
    94.Binary Tree Inorder Traversal
    144.Binary Tree Preorder Traversal
    106.Construct Binary Tree from Inorder and Postorder Traversal
    105.Construct Binary Tree from Preorder and Inorder Traversal
    90.Subsets II
    78.Subsets
    83.Merge Sorted Array
    80.Remove Duplicates from Sorted Array II
    79.Word Search
  • 原文地址:https://www.cnblogs.com/ccz181078/p/5136203.html
Copyright © 2011-2022 走看看