• 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;
    }
  • 相关阅读:
    【操作系统】第九章 虚拟内存
    【计网】第七章
    信息安全数学基础整理笔记
    深入浅出数据分析 笔记总结
    ERROR: Error cloning remote repo 'origin'
    Docker 操作
    centos 安装 git
    CentOS 7 安装 JAVA环境(JDK 1.8)
    如何删除 容器里的软件(彻底)
    Docker 部署 Jenkins :通过SSH配置Linux宿主机为slave节点,运行外部环境
  • 原文地址:https://www.cnblogs.com/ccz181078/p/5136203.html
Copyright © 2020-2023  润新知