ccz181078

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

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;
}

 

posted on 2016-01-16 19:40  nul  阅读(433)  评论(0编辑  收藏  举报