弦图的判定MCS算法(zoj1015)
题意:裸的弦图的判定:
弦图定义:给出一个无向连通图,如果每个环中都存在至少一条弦(环中存在不相邻的两点直接相连)这样的图叫做弦图;
转载:http://blog.csdn.net/crux_d/article/details/2251963
以下是时间复杂度为O(n+m)的算法,n是图的点数,m是图的边数。
第一步:给节点编号
设已编号的节点集合为A,未编号的节点集合为B
开始时A为空,B包含所有节点。
for num=n-1 downto 0 do
{
在B中找节点x,使与x相邻的在A集合中的节点数最多,将x编号为num,
并从B移入A
}
第二步:检查
for num=0 to n-1 do
{
对编号为num的节点x,设所有编号大于num且与x相邻的节点集合为C,
在集合C中找出编号最小的节点y,如果集合C中存在不等于y的节点z,
且y与z间没有边,则此图不是弦图,退出。
}
检查完了,则此图是弦图。
原始算法:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"queue"
#include"algorithm"
#include"string.h"
#include"string"
#include"math.h"
#include"vector"
#include"stack"
#include"map"
#define eps 1e-4
#define inf 0x3f3f3f3f
#define M 1209
#define PI acos(-1.0)
using namespace std;
int cnt,vis[M],num[M],s[M],g[M][M];
void bfs(int n)
{
int i,j,id;
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
cnt=0;
for(i=n;i>=1;i--)
{
id=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&num[id]<num[j])
{
id=j;
}
}
s[i]=id;
vis[id]=1;
for(j=1;j<=n;j++)
{
if(id!=j&&g[id][j]&&!vis[j])
num[j]++;
}
}
}
int psq(int n)
{
int i,j;
for(i=1;i<=n;i++)
{
int id;
for(j=i+1;j<=n;j++)
{
if(g[s[i]][s[j]])
{
id=j;
break;
}
}
for(j=i+1;j<=n;j++)
{
if(g[s[i]][s[j]]&&id!=j&&g[s[id]][s[j]]==0)
return 0;
}
}
return 1; }
int main()
{
int n,m,i;
while(scanf("%d%d",&n,&m),m+n)
{
memset(g,0,sizeof(g));
for(i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a][b]=g[b][a]=1;
}
bfs(n);
if(psq(n))
{
printf("Perfect\n\n");
}
else
printf("Imperfect\n\n");
}
return 0;
}
bfs+优先队列
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"queue"
#include"algorithm"
#include"string.h"
#include"string"
#include"math.h"
#include"vector"
#include"stack"
#include"map"
#define eps 1e-4
#define inf 0x3f3f3f3f
#define M 1009
#define PI acos(-1.0)
using namespace std;
struct Edge
{
int v;
Edge(int vv)
{
v=vv;
}
};
vector<Edge>edge[M];
struct node
{
int id,num;
friend bool operator<(node a,node b)
{
return a.num<b.num;
}
};
int n,num[M],vis[M],link[M],cnt,order[M],q[M],g[M][M];
void bfs(int u)
{
priority_queue<node>q;
memset(num,0,sizeof(num));
memset(link,0,sizeof(link));
memset(vis,0,sizeof(vis));
cnt=n;
node now;
now.id=u;
now.num=1;
q.push(now);
while(!q.empty())
{
node cur=q.top();
if(!vis[cur.id])
{
vis[cur.id]=1;
link[cnt]=cur.id;
order[cur.id]=cnt;
cnt--;
if(cnt==0)
break;
}
q.pop();
for(int i=0;i<(int)edge[cur.id].size();i++)
{
int v=edge[cur.id][i].v;
num[v]++;
now.id=v;
now.num=num[v];
if(!vis[v])
q.push(now);
}
}
}
int check()
{
int i,j,value;
bfs(1);
for(i=1;i<=n;i++)
{
int mini=n+1;
int t=0;
for(j=0;j<(int)edge[link[i]].size();j++)
{
int v=edge[link[i]][j].v;
if(order[v]>i)
{
if(mini>order[v])
{
mini=order[v];
value=v;
}
q[t++]=v;
}
}
for(j=0;j<t;j++)
{
if(q[j]!=value&&g[value][q[j]]==0)
return 0;
}
}
return 1;
}
int main()
{
int m,i,a,b;
while(scanf("%d%d",&n,&m),m||n)
{
for(i=1;i<=n;i++)
edge[i].clear();
memset(g,0,sizeof(g));
for(i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
edge[a].push_back(b);
edge[b].push_back(a);
g[a][b]=g[b][a]=1;
}
if(check())
printf("Perfect\n\n");
else
printf("Imperfect\n\n");
}
}
弦图的判定MCS算法(zoj1015)的更多相关文章
- BZOJ1006 神奇的国度 【弦图染色——最大势算法MCS】
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 4146 Solved: 1916 [Submit][S ...
- bzoj 1006: [HNOI2008]神奇的国度 -- 弦图(最大势算法)
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MB Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角 ...
- ZOJ 1015 弦图判定
一些定义: 弦图是一种特殊图:它的所有极小环都只有3个顶点. 单纯点:该顶点与其邻接点在原图中的导出子图是一个完全图. 图G的完美消去序列:一个顶点序列a1a2a3...an,使得对于每个元素ai,a ...
- bzoj 1242 弦图判定 MCS
题目大意: 给定一张无向图,判断是不是弦图. 题解: 今天刚学了<弦图与区间图> 本来写了一个60行+的学习笔记 结果因为忘了保存重启电脑后被还原了... 那就算了吧. MCS最大势算法, ...
- [bzoj1242] Zju1015 Fishing Net弦图判定
弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...
- BZOJ 1006 完美消除序列&最大势算法&弦图
K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...
- ZOJ 1015 Fishing Net(弦图判定)
In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...
- bzoj 1242: Zju1015 Fishing Net 弦图判定
1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 214 Solved: 81[Submit ...
- bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法
[HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4370 Solved: 2041[Submit][Status][D ...
随机推荐
- 僵尸传染bfs
#include<stdio.h> int map[4][4]={0,0,0,1, 0,0,1,1, 0,0,1,0, 0,1,0,0}; int mx ...
- OpenGL完全教程 第一章 初始化OpenGL
第一章 初始化OpenGL 无论是什么东西,要使用它,就必须对它进行初始化.如果你之前使用过GDI,你应该也多多少少了解到GDI在绘制图形之前要为之创建渲染环境.OpenGL也一样.本章给出的代码,大 ...
- getWindow().setFlags
//设置窗体全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams ...
- Android Gradle 编译错误Java finished with non-zero exit value 2
出现这个错误主要有两类错误 依赖包重复 方法数超过65K 针对第一种错误,可能是由于build.gradle里写了 compile fileTree(dir: 'libs', include: ['* ...
- 【QQ音乐Api】移花接木 打造自己的音乐电台
最近突发奇想想做个在线音乐小网页.需求很简单,如下 搜索歌曲 或 歌手 在线播放音乐 借用qq 或者 百度的 音乐接口 需求明确那就直接动手了 我首先尝试的百度音乐,但是不能在线播放(提示forbid ...
- Windows 一键安装OpenSSL
原理:OpenSSL在github上有开源项目,我们只需要把代码克隆到本地,在本地编译一下就好了 注意事项: 1->在github上获取源码,必须要安装git for windows,网址 ht ...
- 怎么清除file控件的文件路径
还记得上次做一个文件上传,后来测试告诉我说,如果我要是不选择文件了呢?该怎么办?我说:简单啊,做一个取消按钮不就完事了吗!然后我就想一个file空间做一个取消是多么简单的事,用js处理可是想怎么样就怎 ...
- PySe-002-Py-简单示例及编码设定
非常简单而又国际化的例子 Hello World!在控制台依次输入命令:python, print "This is first program %s" % "Hello ...
- VS2013搭建wxWidgets开发环境
一.安装 前往官网下载最新wxWidgets 3.0.0. https://sourceforge.net/projects/wxwindows/files/3.0.0/wxMSW-3.0.0-Set ...
- POJ1528问题解答
#include <iostream>#include <cstdio>#include <cmath> #include <string>#inclu ...