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边关系 ...
随机推荐
- 执行impdp时出现的各种问题
1.不同的表空间,不同的用户,不同的表名 impdp ODS_YYJC_BUF_ZB/ODS_YYJC_BUF_ZB job_name=bs3 directory=EXPDMP exclude=OBJ ...
- 【转载】C#异常Retry通用类
//Retry机制 public static class Retry { /// <summary> /// 重试零个参数无返回值的方法 /// </summary> /// ...
- geoserver-manager发布style失败
当参数给定没有错误时,最有可能的原因就是: sld文件格式应该以UTF-8无BOM格式编码(自己生成的sld文件多数情况下是以UTF-8格式编码).
- Error -27796: Failed to connect to server "ip地址": [10060] Connection timed out
如果出现Error -27796: Failed to connect to server "ip地址": [10060] Connection timed out 这样的错误,如 ...
- popstate实现history路由拦截,监听页面返回事件
1.当活动历史记录条目更改时,将触发popstate事件. 如果被激活的历史记录条目是通过对history.pushState()的调用创建的, 或者受到对history.replaceState() ...
- beego学习笔记(4):开发文档阅读(6)
beego的响应流程: 1.监听的端口接收数据,默认是8080端口. 2.用户请求到达8080端口后,开始数据处理流程. 3.初始化CONTEXT对象.判断是否是WEBSOCKET请求,如果是,设置I ...
- [前端随笔][css] 弹性布局
说在前面 弹性布局,顾名思义就是有弹性,能够根据屏幕/当前空间大小自由伸缩的.使用弹性布局可以很好的适应各种尺寸的客户端. 关键代码 display:flex; 设定元素为弹性布局 <文档传送门 ...
- WordPress SMTP发送邮件插件:WP SMTP
对于一个网站而言,发送邮件的功能是必不可少的,现在的主机一般都支持发送邮件,但是不同的主机由于函数限制或者某些其他原因,可能造成没办法正常发送邮件.这时候,我们可能就要借助第三方SMTP发送邮件. 对 ...
- Eolinker----全局变量的不同场景使用
因为目前eolinker的API自动化测试不支持“构造参数”,因此针对“全局变量”的使用在不同的场景下,可采用不同的方式实现,但是一个参数既然设计成为了全局变量,那么在接口中使用时尽量保证书写风格一致 ...
- linux中top命令
经常用到top命令,也就简单看看进程多不多,卡不卡, 这次在网上找到一个归纳总结的,以供参考. 简介 top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 ...