ZOJ 1015 Fishing Net(判断弦图)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=15

题意:给定一个图。判断是不是弦图?

思路:(1)神马是弦图?对于一个无向图,若该图的任意一个长度大于3的环中存在一条边连接这个环上不相邻的两点,则此图称作弦图。

(2)什么是团?团是原图的一个子图,子图就是包含了原图的某些点,那么就要包含这些点之间的边。并且团不是一般的子图而是一个完全子图,就是这个子图的任意两个顶点之间都有边。下面的ABCD就是原图的一个团。

(3)完美消除序列:原图的一个点的序列(每个点出现且恰好出现一次)v1, v2,……, vn满足{vi, vi+1,…,vn}的组成的子图为团。

(4)一个无向图是弦图当且仅当它有一个完美消除序列。

(5)如何计算完美消除序列?最大势算法:
从n到1的顺序依次给点标号(标号为i的点出现在完美消除序列的第i个)。 设label[i]表示第i个点与多少个已标号的点相
邻,每次选择label[i]最大的未标号的点进行标号。注意这里只是计算出了完美消除序列,但是在求出这个之后还没有判定是不是弦图。

(6)如何从完美消除序列判断原图是不是弦
图?最朴素的办法是依次判断
{vi+1,…,vn}中所有与vi相邻的点是否构成了一个团。可以这样优化:设{vi+1,…,vn}中所有与vi相邻的点依次为
vj1,……,vjk。只需判断vj1是否与vj2,……,vjk相邻即可。

int n,m,g[N][N];
int d[N],a[N],h[N],p[N];

int OK()
{
    int i,j,u;
    vector<int> V;
    FORL1(i,n)
    {
        V.clear();
        FOR1(j,n) if(g[a[i]][j]) if(p[j]>i) V.pb(j);
        for(j=1;j<SZ(V);j++) if(p[V[0]]>p[V[j]])
        {
            swap(V[0],V[j]);
        }
        for(j=1;j<SZ(V);j++)
        {
            if(!g[V[0]][V[j]]) return 0;
        }
    }
    return 1;
}

int main()
{
    Rush(n)
    {
        RD(m);
        if(!n&&!m) break;
        int i,j,k,u,v;
        clr(g,0);
        FOR1(i,m)
        {
            RD(u,v);
            g[u][v]=g[v][u]=1;
        }
        clr(d,0); clr(h,0);
        FORL1(i,n)
        {
            u=-1;
            FOR1(j,n) if(!h[j]&&d[j]>u) u=d[j],k=j;
            a[i]=k; h[k]=1; p[k]=i;
            FOR1(j,n) if(g[k][j]) d[j]++;
        }

        if(OK()) puts("Perfect");
        else puts("Imperfect");
        puts("");
    }
    return 0;
}

ZOJ 1015 Fishing Net(判断弦图),布布扣,bubuko.com

时间: 2024-12-22 12:53:48

ZOJ 1015 Fishing Net(判断弦图)的相关文章

ZOJ 1015 Fishing Net(弦图判定)

In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tools, fishing nets, are produced and fixed by computer. After catching fishes each time, together with plenty of fishes, they will bring back the shabby

[ZOJ 1015]Fishing Net(MCS弦图的判定)

Description In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tools, fishing nets, are produced and fixed by computer. After catching fishes each time, together with plenty of fishes, they will bring back

ZOJ 1015 Fishing Net 弦图MCS

一个无向图是弦图当且仅当有一个完美消除序列. MCS最大势:http://wenku.baidu.com/view/07f4be196c175f0e7cd13784.html Fishing Net Time Limit: 10 Seconds      Memory Limit: 32768 KB In a highly modernized fishing village, inhabitants there make a living on fishery. Their major too

无向图的完美消除序列 判断弦图 ZOJ 1015 Fish net

   ZOJ1015 题意简述:给定一个无向图,判断是否存在一个长度大于3的环路,且其上没有弦(连接环上不同两点的边且不在环上). 命题等价于该图是否存在完美消除序列. 所谓完美消除序列:在 vi,vi+1,...vn vi与之后与vi相邻的点构成一个团(完全子图). 求完美消除序列的MCS算法.倒序给点标号,标号为i的点出现在序列的第i项.对每个顶点i,维护标号label[i],表示标号的度,每次选择标号最大的点标号.用堆加速. 求出了完美消除序列后,只要判断这个序列是否合法就可以得出结论.

ZOJ 1015 弦图判定

一些定义: 弦图是一种特殊图:它的所有极小环都只有3个顶点. 单纯点:该顶点与其邻接点在原图中的导出子图是一个完全图. 图G的完美消去序列:一个顶点序列a1a2a3...an,使得对于每个元素ai,ai在ai.ai+1.ai+2...an的导出子图中是一个单纯点. 弦图有一个性质:任何一个弦图都至少存在一个单纯点(该点和其邻接点组成一个完全图) 弦图另一个性质:一个图是弦图当且仅当其存在完美消去序列.(归纳证明) 最大势算法(msc):若原图是弦图,则该算法计算出的序列是完美消去序列. 算法大致

【ZOJ】1015 Fishing Net

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1015 题意:给出一个n个点的无向图,询问是否为弦图,弦图定义为对于图中任意长度>3的环一定存在环上不相邻的点有边相连(n<=1000) #include <bits/stdc++.h> using namespace std; const int N=1005; int n, m, ihead[N], cnt, tag[N], pos[N]; bool vi

bzoj 1242: Zju1015 Fishing Net 弦图判定

1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 214  Solved: 81[Submit][Status][Discuss] Description 在 一个高度信息化的渔村,鱼网的制作和修补都是由电脑完成.众所周知,鱼网是由网组成的(废话),网组成的东西叫网眼.如果网眼够小,就能捕到很多鱼:如果 网眼太大,鱼就会全部漏走.每次捕鱼回来,鱼网都会烂得很厉害,小网眼会变成网眼,那鱼网就需

弦图小结

CDQ的论文 Click Here 以下纯属复制论文,避免以后再看一次 一些概念 子图 点集和边集都是原图的子集的图 诱导子图 是子图,不含其它边 团 子图,并且是完全图 极大团 不是任何一个团的子图 最大团 点数最多的团 最小染色 用最少的颜色染给每个点,使相邻点不同色 最大独立集 不相邻的最大点集 最小团覆盖 最少的团覆盖所有点 显然的结论 团数\(\le\)色数 最大独立集\(\le\)最小团覆盖 弦 连接环内两个不相邻的点的边 弦图 任意大于三的环都至少有一条弦 结论1 弦图的诱导子图是

弦图与区间图

原来想把论文里面所有没证的东西都证一遍,结果发现我太弱证不了[捂脸熊]那就把一些结论记一下吧QAQ以后有什么兴趣的话再来补证明 一些定义什么的自行脑补吧 1.对任意的一张图来说,团数<=色数,最大独立集数<=最小团覆盖数.当图是弦图的时候这两个式子都取到了等号. 2.一张图是弦图当且仅当它有一个完美消除序列. 3.最大势算法(MCS)求一张弦图的完美消除序列.从n到1的顺序给每个点标号,设label[i]表示i与多少个已经标号的节点标号.那么每次选择label[i]最大点进行标号. mlogn