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边关系 ...
随机推荐
- Tensorflow常用函数说明(一)
首先最开始应该清楚一个知识,最外面的那个[ [ [ ]]]括号代表第一维,对应维度数字0,第二个对应1,多维时最后一个对应数字-1:因为后面有用到 1 矩阵变换 tf.shape(Tensor) 返回 ...
- 离线下载pip包进行安装【转】
Host-A 不能上网,但是需要在上面安装Python-package 通过另外一台能上网的Host-B主机 1. 下载需要离线安装的Packages 在Host-B上执行如下命令: 安装单个Pack ...
- Android 开发笔记(一) 按钮事件调用Activity
UI创建按钮及事件 Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);mEmailSignInB ...
- 「caffe编译bug」.build_release/lib/libcaffe.so: undefined reference to cv::imread
转自:https://www.douban.com/note/568788483/ CXX/LD -o .build_release/tools/convert_imageset.bin.build_ ...
- [转载]C++多态技术
摘自: http://www.royaloo.com/articles/articles_2003/PolymorphismInCpp.htm http://blog.sciencenet.cn/bl ...
- URL中斜杠/和反斜杠\的区别小结
Unix使用斜杆/ 作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用 斜杆/ 作为分隔符. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不 ...
- python 多线程, 多进程, 协程
1. 介绍: threading用于提供线程相关的操作,线程是应用程序中工作的最小单元.python当前版本的多线程库没有实现优先级.线程组,线程也不能被停止.暂停.恢复.中断. 2. 1 线程执行 ...
- python基础(9)--递归、二叉算法、多维数组、正则表达式
1.递归 在函数内部,可以调其他函数,如果一个函数在内部调用它本身,这个函数就是递归函数.递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于裂解 递归算法解决问题的特点: 1)递归是 ...
- 洛谷P1615 西游记公司 题解
题目传送门 这道题题面写得非常好. 但好像并没有什么ruan用. 这道题貌似就是把时间差求出来,乘上猪八戒能偷的电脑数就好了.(注意long long) #include<bits/stdc++ ...
- MVC – 3.EF(Entity Framework)
1.实体框架(EF)简介 与ADO.NET的关系 全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框 ...