弦图的判定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 ...
随机推荐
- BLE蓝牙的广播类型
广播的类型一般分为四种,见如下表格: 1. 可连接的非定向广播(Connectable Undirected Event Type): 这是一种用途最广的广播类型,包括广播数据和扫描响应数据,它表示当 ...
- Qt调用Server SQL中的存储过程
Server SQL中的存储过程如下: CREATE procedure PINSERTPC @pcnum int, @pcname varchar(50), @pctype int, @ipaddr ...
- NOIP2013,复赛及同步赛,报名及比赛,专题页面
本通知的对象仅仅是福州第十九中学的学生 所有参加复赛以及同步赛的选手,请务必要仔细阅读:<关于CCF NOIP2013复赛有关事宜的通知>,里面有比赛的时间.地点.以及比赛费用的说明. 参 ...
- 集合类(Objective-C & Swift)
内容提要: 本文前两部分讲了Cocoa的集合类和Swift的集合类,其中Cocoa提供的集合类包括NSArray.NSMutableArray.NSDictionary.NSMutableDictio ...
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
- eclipse中hibernate逆向工程出错
问题已解决!原因是Console configuration的信息编辑有误. 上图中Database connection,如果有已编辑好的可用连接信息就选择,没有的情况下就new一个 如果没有Dri ...
- MFC之目录结构及消息流转(一)
跟上时代,用vs2010, 新建一个MFC应用程序Helloworld. 目录结构: 所有文件分为6个部分:解决方案相关文件.工程相关文件.应用程序头文件和源文件.资源文件.预编译头文件和编译链接生成 ...
- iOS:runtime最全的知识总结
runtime 完整总结 好东西,应该拿出来与大家分享... 南峰子博客地址:http://southpeak.github.io/blog/categories/ios/ 原文链接:http://w ...
- Inside Flask - Flask 简介
Inside Flask - Flask 简介 前言 Flask 的设计目标是实现一个 wsgi 的微框架,其核心代码保持简单和可扩展性,很容易学习.对于有一定经验初学者而言,跟着例子和一些书的代码来 ...
- iOS小技巧
键盘透明: textField.keyboardAppearance = UIKeyboardAppearanceAlert; 状态栏的网络活动风火轮是否旋转: [UIApplication shar ...