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=-;
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=;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(,));
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=;i<seq.size()/;i++)
swap(seq[i],seq[seq.size()--i]);
for (int i=;i<seq.size();i++)
rk[seq[i]]=i;
vector<int> vec;
for (int i=;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=;i<vec.size();i++)
vec[i]=seq[vec[i]];
for (int i=;i<vec.size();i++)
{
if (S.find(make_pair(vec[],vec[i]))==S.end())
{
printf("Imperfect\n");
return ;
}
}
}
printf("Perfect\n");
}

bzoj 1242: Zju1015 Fishing Net 弦图判定的更多相关文章

  1. [bzoj1242] Zju1015 Fishing Net弦图判定

    弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...

  2. bzoj 1242 弦图判定 MCS

    题目大意: 给定一张无向图,判断是不是弦图. 题解: 今天刚学了<弦图与区间图> 本来写了一个60行+的学习笔记 结果因为忘了保存重启电脑后被还原了... 那就算了吧. MCS最大势算法, ...

  3. ZOJ 1015 Fishing Net(弦图判定)

    In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...

  4. ZOJ 1015 弦图判定

    一些定义: 弦图是一种特殊图:它的所有极小环都只有3个顶点. 单纯点:该顶点与其邻接点在原图中的导出子图是一个完全图. 图G的完美消去序列:一个顶点序列a1a2a3...an,使得对于每个元素ai,a ...

  5. bzoj1242(弦图判定)

    cdqppt地址:https://wenku.baidu.com/view/a2bf4ad9ad51f01dc281f1df.html: 代码实现参考的http://blog.csdn.net/u01 ...

  6. Zju1015 Fishing Net

    弦图判定 代码 #include<cstdio> #include<queue> #define mp make_pair #define fi first #define s ...

  7. ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net

    ●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...

  8. BZOJ 1006 完美消除序列&最大势算法&弦图

    K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...

  9. 弦图的判定MCS算法(zoj1015)

    题意:裸的弦图的判定: 弦图定义:给出一个无向连通图,如果每个环中都存在至少一条弦(环中存在不相邻的两点直接相连)这样的图叫做弦图: 转载:http://blog.csdn.net/crux_d/ar ...

随机推荐

  1. Redis - 环境的安装配置

    Redis 下载安装步骤: 下载 redis 源码: [huey@huey-K42JE ~]$ wget http://download.redis.io/releases/redis-x.y.z.t ...

  2. HDOJ2001计算两点间的距离

    计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. Android 扫描蓝牙设备

    Android扫描蓝牙设备是个异步的过程,核心的步骤为:调用bluetoothAdapter的startDiscovery()进行设备扫描,扫描的结果通过广播接收处理!具体如下: 1.申请相关权限 & ...

  4. python - 图例显示中文

    # -*- coding: utf-8 -*- """ Created on Mon Nov 30 13:24:00 2015 @author: jx_luo " ...

  5. Today’s words

    transcendental,transcendental capacity commission,the commission would keep venetian unimodel transi ...

  6. [Guava学习笔记]Collections: 不可变集合, 新集合类型

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3843386.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  7. 利用AVL树实现搬箱问题的best fit策略

    //my.h //定义两个数据类型,货物Goods,箱子Box #include <vector> #include <cstddef> #include <iostre ...

  8. 《编写高质量代码-Web前端开发修改之道》笔记--第二章 团队合作

    本章内容: 揭秘前端开发工程师 欲精一行,必先通十行 增加代码的可读性--注释 提高重用性--公共组件和私有组件的维护 冗余和精简的矛盾--选择集中还是选择分散 磨刀不误砍柴工--前期的构思很重要 制 ...

  9. 如何查看Oracle的用户权限

    ORACLE数据字典视图的种类分别为:USER,ALL 和 DBA. USER_*:有关用户所拥有的对象信息,即用户自己创建的对象信息 ALL_*:有关用户可以访问的对象的信息,即用户自己创建的对象的 ...

  10. ListView 复制到剪切板

    private void 导出ToolStripMenuItem_Click(object sender, EventArgs e) { Clipboard.SetText(GetListView(l ...