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边关系 ...
随机推荐
- 天梯赛 L2-010 排座位 (并查集)
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...
- koa源码阅读[1]-koa与koa-compose
接上次挖的坑,对koa2.x相关的源码进行分析 第一篇.不得不说,koa是一个很轻量.很优雅的http框架,尤其是在2.x以后移除了co的引入,使其代码变得更为清晰. express和koa同为一批人 ...
- PHP中的 get_magic_quotes_runtime
get_magic_quotes_runtime() 获得外部文件及数据库资料时是否进行转义 set_magic_quotes_runtime(1); 临时设置获得外部文件及数据库资料时是否进行转义 ...
- python进阶之py文件内置属性
前言 对于任何一个python文件来说,当python解释器运行一个py文件,会自动将一些内容加载到内置的属性中:一个模块我们可以看做是一个比类更大的对象. 查看模块的内置属性 我们先创建一个典型的p ...
- Nginx源码分析-ngx_module_s结构体
该结构体是整个Nginx模块化架构最基本的数据结构体.它描述了Nginx程序中一个模块应该包括的基本属性,在tengine/src/core/ngx_conf_file.h中定义了该结构体 struc ...
- Linux 基础目录和命令
Linux 标准目录结构 初学Linux,首先需要弄清Linux 标准目录结构 / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存 ...
- js自动检索输入文章长度
1. 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- python基础(11)--面向对象
1.概述 面向过程:根据业务的逻辑从上到下写代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发更快更好更强 面向过程编程最易被初学者接受 ...
- Linux命令之ip命令
linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...
- Bootstrap – 1.认识
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...