【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 vis[N];
struct E { int next, to; }e[N*N];
void add(int u, int v) {
e[++cnt]={ihead[u], v}; ihead[u]=cnt;
e[++cnt]={ihead[v], u}; ihead[v]=cnt;
}
void cln() {
memset(ihead, 0, sizeof(int)*(n+1));
memset(tag, 0, sizeof(int)*(n+1));
memset(pos, 0, sizeof(int)*(n+1));
cnt=0;
}
bool check() {
int x, y, mn, mx;
for(int now=n; now; --now) {
mx=-1; mn=~0u>>1; x=y=0;
for(int i=1; i<=n; ++i) if(!pos[i] && tag[i]>mx) mx=tag[i], x=i;
pos[x]=now;
for(int i=ihead[x]; i; i=e[i].next) if(!pos[e[i].to]) tag[e[i].to]++;
for(int i=ihead[x]; i; i=e[i].next) if(pos[e[i].to]>pos[x] && pos[e[i].to]<mn) mn=pos[e[i].to], y=e[i].to;
for(int i=ihead[y]; i; i=e[i].next) vis[e[i].to]=1; vis[y]=1;
for(int i=ihead[x]; i; i=e[i].next) if(pos[e[i].to]>pos[x] && !vis[e[i].to]) return 0;
for(int i=ihead[y]; i; i=e[i].next) vis[e[i].to]=0; vis[y]=0;
}
return 1;
}
int main() {
while(scanf("%d%d", &n, &m), n&&m) {
int x, y;
for(int i=0; i<m; ++i) { scanf("%d%d", &x, &y); add(x, y); }
check()?puts("Perfect"):puts("Imperfect"); puts("");
cln();
}
return 0;
}
弦图判定裸题= =详细看cdq的论文= =《弦图与区间图》
弦图定义上边说了= =
下面来说一下性质:
团:一个完全图,即团中任意点对都有边相连。
单纯点:如果$x$及其相邻的点组成了一个团,那么$x$就是一个单纯点。
完美消除序列:一个点的序列,每个点出现有且一次,且满足对于任意$v_i$,在$v_{i+1} \cdots v_{n}$的诱导子图中$v_i$是一个单纯点。
定理1:一个弦图至少有一个完美消除序列。(证明看论文)
定理2:弦图的诱导子图也是弦图
所以裸的找完美序列的算法就是每一次找不在完美序列的点试着加入当前维护的完美序列中看是否为一个单纯点,如果是则加入。当然这是裸暴力= =
于是cdq论文介绍了两种算法= =一种是字典序bfs..一种是最大势算法,由于我看网上实现都是最大势算法(mcs算法)= =于是我就学下最大势就ok了..反正两种算法复杂度都是$O(n+m)$
首先mcs的原理是先找出一个序列然后判断这是否为一个完美消除序列。那么mcs算法是如何找出一个序列的呢?
鬼知道!反正貌似这就是一种贪心QAQcdq论文也没有解释QAQ,每一次向完美序列前面加一个点,而每次加入的点是与当前维护序列中的点连边最多的不在序列中的点= =这是什么鬼啊!
所以算法就是每一次找与序列中的点连边最多的不在序列中的点,加入= =
最后判断这个序列是否合法:
如果我们要判断$v_i$这个点,即要在$v_{i+1} \cdots v_{n}$找出与$v_i$相邻的点集$v_{j_1}, v_{j_2}, \cdots v_{j_k}$,且是按在序列的顺序从小到大的顺序。那么我们只需要判断$v_{j_1}$与$v_{j_i}, i>1$是否有边相连即可,如果没有,这个图就不是弦图。因为这是按顺序加入到序列中的,我们又要求这个点集是一个团,那么显然我们只需要判断在序列中最前面的$v_{j_1}$与其它是否相连即可,因为$v_{j_i}, i>1$都已经判断过了= =
在找连边最多的点那一步,是能用链表优化到$O(1)$的,但是我太懒了,直接暴力= =反正本题能过...就算不用$O(1)$的,我们也可以用set = =
【ZOJ】1015 Fishing Net的更多相关文章
- 【ZOJ】4012 Your Bridge is under Attack
[ZOJ]4012 Your Bridge is under Attack 平面上随机n个点,然后给出m条直线,问直线上有几个点 \(n,m \leq 10^{5}\) 由于共线的点不会太多,于是我们 ...
- 【ZOJ】【3329】One Person Game
概率DP/数学期望 kuangbin总结题目中的第三道 看来还是没有进入状态啊……都说是DP了……当然是要找[状态之间的转移关系]了…… 本题中dp[i]跟 dp[i-(k1+k2+k3)] 到dp[ ...
- 【有上下界网络流】【ZOJ】2314 Reactor Cooling
[算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...
- 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)
http://www.lydsy.com/JudgeOnline/problem.php?id=1015 看了题解的囧T_T,一开始以为是求割点,但是想到割点不能统计.... 这题用并查集,思想很巧妙 ...
- 【BZOJ】1015: [JSOI2008]星球大战starwar
1015: [JSOI2008]星球大战starwar 题意:一个点数为N(1<= 40w),边数为M(1<=20w)的图,总共删除k个节点,问开始以及每次删除一个节点之后图的连通块数? ...
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
- 【PAT】1015 德才论 (25)(25 分)
1015 德才论 (25)(25 分) 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得 ...
- 【ZOJ】3740:Water Level【DP】
Water Level Time Limit: 2 Seconds Memory Limit: 65536 KB Hangzhou is a beautiful city, especial ...
- 【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
转自:http://www.cnblogs.com/kevince/p/3887827.html 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这么一说大家心里肯定有数了吧,“不就是nex ...
随机推荐
- Java Eclipse进行断点调试
如何调试Java程序? 大家最开始学习Java,都会觉得IDE调试好高端有木有,其实很简单了. 下文会尽量简单直观的教会你在Eclipse中调试,其他的IDE调试步骤也是类似的. 1.在你觉得有错的地 ...
- Sublime Text3使用记录
概述 Sublime是一款很好用的程序编辑网站,主要说的就是编写网页代码,同时Sublime支持接口开发,致使网络上有很多大牛写的编辑插件也很多,使用起来也自如方便了好多,最近一直在用Sublime ...
- 运维自动化之ansible的安装与使用(包括模块与playbook使用)(转发)
原文 http://dl528888.blog.51cto.com/2382721/1435415 我使用过puppet(地址是http://dl528888.blog.51cto.com/2382 ...
- wp8 入门到精通 ---转换
/// <summary> /// 颜色字符串转Color /// </summary> public static ...
- 如何解决""No boot device available(无可用的引导设备)”错误
首先换一个镜像文件试一试,如果还不行就按以下方法尝试 http://www.parallelsdesktop.cn/xnjxt-wydsb.html Parallels Desktop 常见问题 ht ...
- opengl纹理映射总结
大概步骤: 1.创建纹理对象,并为他指定一个纹理. 2.确定纹理如何应用到每个像素上. 3.启用纹理贴图 4.绘制场景,提供纹理和几何坐标 过滤:由于我们提供的纹理图像很少能和最终的屏幕坐标形成对应, ...
- LVS 三种工作模式原理、以及优缺点比较(转载)
原文地址:http://9ilinux.com/149.html 一.NAT模式(VS-NAT) 原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此R ...
- LoadRunner 脚本学习 -- 指针基础
先搞清楚 ++a 和 a++的区别 ++a : 前缀++, 先自增,后表达式 a++ : 后缀++, 先表达式,后自增 前缀,自增立即生效. 后缀,下次才会看到效果. 一维数组的指针 Action ...
- 在MySQL中存储大文件
我们的目标:把一首mp3保存到MySQL数据库中! 由于MySQL默认当存入的数据太大时会抛异常,所以应在my.ini中添加如下配置!max_allowed_packet=10485760,这样,可以 ...
- BZOJ 2716 [Violet 3]天使玩偶 ——KD-Tree
[题目分析] KD-Tree的例题.同BZOJ2648. [代码] #include <cstdio> #include <cstring> #include <cstd ...