ZOJ 1015 弦图判定
一些定义:
弦图是一种特殊图:它的所有极小环都只有3个顶点。
单纯点:该顶点与其邻接点在原图中的导出子图是一个完全图。
图G的完美消去序列:一个顶点序列a1a2a3...an,使得对于每个元素ai,ai在ai、ai+1、ai+2...an的导出子图中是一个单纯点。
弦图有一个性质:任何一个弦图都至少存在一个单纯点(该点和其邻接点组成一个完全图)
弦图另一个性质:一个图是弦图当且仅当其存在完美消去序列。(归纳证明)
最大势算法(msc):若原图是弦图,则该算法计算出的序列是完美消去序列。
算法大致思想:从后往前计算序列,每次选择点v作为序列中的元素,v是还未选的点中与已经选了的点连边最多的点。
然后检查该序列是否是完美消去序列。
请看陈丹琦的ppt:《弦图与区间图》
BZOJ:
/**************************************************************
Problem: 1242
User: idy002
Language: C++
Result: Accepted
Time:544 ms
Memory:1816 kb
****************************************************************/ #include <cstdio>
#include <cstring>
#define N 1010
#define M N*N*2 int n, m;
bool c[N][N];
int qu[N], inq[N], dgr[N];
int stk[N], top; void msc() {
dgr[] = -;
for( int i=n; i>=; i-- ) {
int s = ;
for( int u=; u<=n; u++ )
if( !inq[u] && dgr[u]>dgr[s] ) s=u;
qu[i] = s;
inq[s] = true;
for( int u=; u<=n; u++ )
if( !inq[u] && c[s][u] ) dgr[u]++;
}
}
bool check() {
for( int i=n; i>=; i-- ) {
int s=qu[i];
top = ;
for( int j=i+; j<=n; j++ )
if( c[s][qu[j]] ) stk[++top] = qu[j];
if( top== ) continue;
for( int j=; j<=top; j++ )
if( !c[stk[]][stk[j]] ) return false;
}
return true;
}
int main() {
scanf( "%d%d", &n, &m );
for( int i=,u,v; i<=m; i++ ) {
scanf( "%d%d", &u, &v );
c[u][v] = c[v][u] = ;
}
msc();
printf( "%s\n", check() ? "Perfect" : "Imperfect" );
}
ZOJ:
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#define maxn 1010
using namespace std; int n, m;
vector<int> g[maxn];
bool connect[maxn][maxn]; int id[maxn];
int label[maxn];
int seq[maxn]; struct Stat {
int lab, u;
Stat( int lab, int u ) : lab(lab), u(u) {}
bool operator<( const Stat & b ) const {
return lab<b.lab;
}
};
void mcs() {
priority_queue<Stat> pq;
memset( label, , sizeof(label) );
memset( id, , sizeof(id) );
for( int u=; u<=n; u++ ) pq.push(Stat(,u)); for( int i=n; i>=; i-- ) {
while( id[pq.top().u] ) pq.pop();
int u = pq.top().u;
pq.pop();
id[u] = i;
for( int t=; t<g[u].size(); t++ ) {
int v = g[u][t];
if( !id[v] ) {
label[v]++;
pq.push( Stat(label[v],v) );
}
}
}
for( int u=; u<=n; u++ )
seq[id[u]] = u;
} bool check() {
vector<int> c;
for( int i=; i<=n; i++ ) {
int u = seq[i];
c.clear();
for( int t=; t<g[u].size(); t++ ) {
int v = g[u][t];
if( id[v]>id[u] )
c.push_back(v);
}
if( c.empty() ) continue;
int sc = c[];
for( int t=; t<c.size(); t++ )
if( id[c[t]]<id[sc] ) sc=c[t];
for( int t=; t<c.size(); t++ ) {
int v = c[t];
if( v==sc ) continue;
if( !connect[sc][v] ) return false;
}
}
return true;
}
void init( int n ) {
memset( connect, false, sizeof(connect) );
for( int u=; u<=n; u++ ) g[u].clear();
}
int main() {
while() {
scanf( "%d%d", &n, &m );
if( n== && m== ) return ;
init(n);
for( int i=,u,v; i<=m; i++ ) {
scanf( "%d%d", &u, &v );
connect[u][v] = connect[v][u] = true;
g[u].push_back(v);
g[v].push_back(u);
}
mcs();
printf( "%s\n\n", check() ? "Perfect" : "Imperfect" );
}
}
暴力:每次找单纯点,删掉,再找,如果能删完就说明是.
O(n^4*...)
#include <cstdio>
#include <vector>
#include <set>
#define N 110
#define foreach(it,s) for( typeof(s.begin()) it=s.begin(); it!=s.end(); it++ )
using namespace std; int n, m;
set<int> s;
set<int> g[N]; bool find_erase() {
foreach( u, s ) {
vector<int> vc;
foreach( v, g[*u] )
vc.push_back(*v);
bool ok = true;
for( int a=; a<vc.size() && ok; a++ )
for( int b=a+; b<vc.size() && ok; b++ )
if( g[vc[a]].count(vc[b])== )
ok = false;
if( ok ) {
s.erase(*u);
for( int t=; t<g[*u].size(); t++ )
g[vc[t]].erase(*u);
return true;
}
}
return false;
}
int main() {
scanf( "%d%d", &n, &m );
for( int i=; i<=n; i++ )
s.insert(i);
for( int i=,u,v; i<=m; i++ ) {
scanf( "%d%d", &u, &v );
if( g[u].count(v) ) continue;
g[u].insert(v);
g[v].insert(u);
}
for( int t=; t<=n; t++ ) {
if( !find_erase() ) {
printf( "Imperfect\n" );
return ;
}
}
printf( "Perfect\n" );
}
ZOJ 1015 弦图判定的更多相关文章
- bzoj 1242: Zju1015 Fishing Net 弦图判定
1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 214 Solved: 81[Submit ...
- [bzoj1242] Zju1015 Fishing Net弦图判定
弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...
- ZOJ 1015 Fishing Net(弦图判定)
In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...
- bzoj 1242 弦图判定 MCS
题目大意: 给定一张无向图,判断是不是弦图. 题解: 今天刚学了<弦图与区间图> 本来写了一个60行+的学习笔记 结果因为忘了保存重启电脑后被还原了... 那就算了吧. MCS最大势算法, ...
- bzoj1242(弦图判定)
cdqppt地址:https://wenku.baidu.com/view/a2bf4ad9ad51f01dc281f1df.html: 代码实现参考的http://blog.csdn.net/u01 ...
- ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net
●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...
- ZOJ 1015 Fishing Net(判断弦图)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=15 题意:给定一个图.判断是不是弦图? 思路:(1)神马是弦图?对于一 ...
- 弦图的判定MCS算法(zoj1015)
题意:裸的弦图的判定: 弦图定义:给出一个无向连通图,如果每个环中都存在至少一条弦(环中存在不相邻的两点直接相连)这样的图叫做弦图: 转载:http://blog.csdn.net/crux_d/ar ...
- BZOJ 1006 完美消除序列&最大势算法&弦图
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...
随机推荐
- docker ubuntu容器更换阿里源(转)
问题:使用docker 利用下载的ubuntu镜像启动容器时,使用的源下载更新软件的速度较慢. 解决这个问题的方法是跟新ubuntu容器的源 示例:以ubuntu为基础镜像 启动一个名称为 test0 ...
- 环境变量配错了 command not found
一般就是忘记在PATH 前面加$ 1.可以用whereis或者which命令查看一下有没有这个命令 具体执行which lswhereis ls 2.系统环境变量导致的问题解决方案: exportPA ...
- python基础之常用内置函数
前言 python有许多内置的函数,它们定义在python的builtins模块,在python的代码中可以直接使用它们. 常用的内置函数 类型转换 int python的整数类型都是int类型的实例 ...
- UBIFS学习笔记
在做项目的时候,发现flash芯片有异常现象,经过打印分析,发现是UBIFS方面设置有一些问题,经过查阅一部分资料,最终得到问题的答案. 在解决问题的过程中,发现打印信息比较重要,但网上并没有直接的相 ...
- WebHeaderCollection类
.net添加http报头 string[] allKeys = WebHeaderCollection.AllKeys; for (int i = 0; i < allKeys.Length; ...
- IDEA配置toString方法
1.toString JSON带父类toString public java.lang.String toString() { final java.lang.StringBuilder sb = n ...
- Codeforces 822D My pretty girl Noora(最小素因子的性质)
题目大意:一场选美比赛有N个人,可以分成N/x,每组x人.每组的比较次数为x(x-1)/2,f[N]为最后决出冠军所需的比较次数,可以通过改变x的值使f[N]改变.题目给出t,l,r(1 ≤ t &l ...
- js写一个插件
//;分号开头,用于防止代码压缩合并时与其它代码混在一起造成语法错误 //而事实证明,uglify压缩工具会将无意义的前置分号去掉,我只是习惯了这么写 //(function(){})();立即执行函 ...
- vue 条件渲染与列表渲染
本文是对官方文档的整理 因为 v-if 是一个指令,所以必须将它添加到一个元素上.但是如果想切换多个元素呢?此时可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v ...
- CSU 1424 Qz’s Maximum All One Square
原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1424 逐渐找到做这种题的感觉了. 二分法.g[i][j]存储坐标(i, j)的值,s[i ...