bzoj 1242: Zju1015 Fishing Net 弦图判定

1242: Zju1015 Fishing Net弦图判定

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 214  Solved: 81
[Submit][Status][Discuss]

Description


一个高度信息化的渔村,鱼网的制作和修补都是由电脑完成。众所周知,鱼网是由网组成的(废话),网组成的东西叫网眼。如果网眼够小,就能捕到很多鱼;如果
网眼太大,鱼就会全部漏走。每次捕鱼回来,鱼网都会烂得很厉害,小网眼会变成网眼,那鱼网就需要修补。他们希望有一个程序能够为他们判断鱼网是否需要修
补。程序会把鱼网看作一个联通的图(不用进一步解释了吧)。他们的判断方法是:任何一个长度(组成其的边的数目)超过3的闭合的圈,都必须有一条交线将它
分作两部分。(提示:递归下去,其实就是每个网眼都只能是三角形)如果合乎要求,程序就输出“Perfect",否则输出"Imperfect".
注:这里的交线是指一个联结一封闭圈的不同结点而捕属于该圈的一条边。

Input

数据以一行N M开始,表示鱼网有N个结点和M条边。(n<=0<=1000)以下M行是M条边的描述。每行两个整数A,B,表示结点A与结点B之间存在一条边。

Output

输出每个鱼网的测试结果,Perfect或Imperfect

Sample Input

4 4
1 2
2 3
3 4
4 1

Sample Output

Imperfect

HINT

Source

弦图判定

  弦图裸题,就是边的范围是n^2,而不是n。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
using namespace std;
#define MAXN 1010
#define MAXE MAXN*MAXN*2
#define MAXV MAXN
struct Edge
{
        int np;
        Edge *next;
}E[MAXE],*V[MAXV];
int tope=-1;
void addedge(int x,int y)
{
        E[++tope].np=y;
        E[tope].next=V[x];
        V[x]=&E[tope];
}
bool vis[MAXN];
int deg[MAXN];
priority_queue<pair<int,int> > PQ;
vector<int> seq;
int rk[MAXN];
set<pair<int,int> > S;

int main()
{
        freopen("input.txt","r",stdin);
        int n,m;
        scanf("%d%d",&n,&m);
        int x,y;
        for (int i=0;i<m;i++)
        {
                scanf("%d%d",&x,&y);
                if (S.find(make_pair(x,y))!=S.end())continue;
                addedge(x,y);
                addedge(y,x);
                S.insert(make_pair(x,y));
                S.insert(make_pair(y,x));
        }
        PQ.push(make_pair(0,1));
        while (!PQ.empty())
        {
                Edge *ne;
                pair<int,int> pr=PQ.top();
                PQ.pop();
                if (vis[pr.second] || deg[pr.second]!=pr.first)continue;
                seq.push_back(pr.second);
                vis[pr.second]=true;
                for (ne=V[pr.second];ne;ne=ne->next)
                {
                        if (!vis[ne->np])
                        {
                                deg[ne->np]++;
                                PQ.push(make_pair(deg[ne->np],ne->np));
                        }
                }
        }
        if (seq.size()!=n)
        {
//                printf("Imperfect\n");
//                return 0;
        }
        for (int i=0;i<seq.size()/2;i++)
                swap(seq[i],seq[seq.size()-1-i]);
        for (int i=0;i<seq.size();i++)
                rk[seq[i]]=i;
        vector<int> vec;
        for (int i=0;i<seq.size();i++)
        {
                int now=seq[i];
                Edge *ne;
                vec.clear();
                for (ne=V[now];ne;ne=ne->next)
                {
                        if (rk[ne->np]>rk[now])
                        {
                                vec.push_back(rk[ne->np]);
                        }
                }
                sort(vec.begin(),vec.end());
                for (int i=0;i<vec.size();i++)
                        vec[i]=seq[vec[i]];
                for (int i=1;i<vec.size();i++)
                {
                        if (S.find(make_pair(vec[0],vec[i]))==S.end())
                        {
                                printf("Imperfect\n");
                                return 0;
                        }
                }
        }
        printf("Perfect\n");
}
时间: 2024-10-12 14:41:37

bzoj 1242: Zju1015 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

一个无向图是弦图当且仅当有一个完美消除序列. 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 弦图判定

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

Zju1015 Fishing Net

弦图判定 代码 1 #include<cstdio> 2 #include<queue> 3 #define mp make_pair 4 #define fi first 5 #define sc second 6 using namespace std; 7 const int N = 2001010; 8 int n,m,a,b,i,j; 9 int dp,p[N],pre[N],tt[N],o,vis[N],sum[N],id[N],ID[N]; 10 priority_q

弦图 完美消除序列 MCS算法

对于普通图的两个性质: 最大团数 ≤ 最小色数 最大独立集 ≤ 最小团覆盖 而在弦图就变成了: 最大团数=最小色数 最大独立集=最小团覆盖 (虽然不知道有什么用 完美消除序列: 对与序列中的点vi,排在vi后面并且和vi相连的点是一个团 一个图存在完美消除序列是它是弦图的充要条件 那么完美消除序列有什么用呢?用处可大啦 求弦图的最大团数/最小色数的时候,只要在完美消除序列上从后往前贪心染色即可. 而求最大独立集/最小团覆盖的时候,只要在完美消除序列上从前往后贪心取点即可. 那么就来了一系列的问题

[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(判断弦图)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=15 题意:给定一个图.判断是不是弦图? 思路:(1)神马是弦图?对于一个无向图,若该图的任意一个长度大于3的环中存在一条边连接这个环上不相邻的两点,则此图称作弦图. (2)什么是团?团是原图的一个子图,子图就是包含了原图的某些点,那么就要包含这些点之间的边.并且团不是一般的子图而是一个完全子图,就是这个子图的任意两个顶点之间都有边.下面的ABCD就是原图的一个团. (

[BZOJ 1006] [HNOI2008] 神奇的国度 【弦图最小染色】

题目链接: BZOJ - 1006 题目分析 这道题是一个弦图最小染色数的裸的模型. 弦图的最小染色求法,先求出弦图的完美消除序列(MCS算法),再按照完美消除序列,从后向前倒着,给每个点染能染的最小颜色. 求出的颜色数就是最小染色,同时也是最大团. 代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <cstring> #in

bzoj 1006: [HNOI2008]神奇的国度 弦图的染色问题&amp;&amp;弦图的完美消除序列

1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1788  Solved: 775[Submit][Status] Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系,是指N个人 A1A2...An之间仅存在N对认识关系:(A1A2)