弦图的判定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 ...
随机推荐
- 不要让mysql犹豫不决
DROP TABLE IF EXISTS `w1`; CREATE TABLE `w1` ( `waid` ) NOT NULL AUTO_INCREMENT, `wa1` ) COLLATE utf ...
- VS C++ 从一个窗口创建另一个窗口
一.在stdafx.h文件中,添加: #include "Form2.h" / stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目 ...
- Apache Camel
Apache Camel 1 import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; i ...
- hbase与mapreduce集成
一:运行给定的案例 1.获取jar包里的方法 2.运行hbase自带的mapreduce程序 lib/hbase-server-0.98.6-hadoop2.jar 3.具体运行 4.运行一个小方法 ...
- 用facebook账号登陆到你的Magento网店
Inchoo提供magento和facebook连接的扩展,可以到http://inchoo.net/ecommerce/magento/facebook-connect-magento-extens ...
- 长宽广州地区DNS
网络又抽风了,发现时DNS的问题. 打客服电话问到了长宽广州的DNS: 首选:211.162.62.1备用:211.162.62.61
- JS判断对象类型
对于确定JS内置对象类型,JS提供了typeof运算符,该运算符得到的结果为以下6种:number,boolean,string,function,object,undefined.不过对绝大多数对象 ...
- EGO Refresh小总结
这几天项目做完,有点闲,正好可以用来做做总结. 忘了是哪位博客大牛说:不能因为知识点小.少而不做总结. 那么现在就开始实践一把吧~ 总的来说,EGO有几点需要设置,设置完之后,就能够自如地用了. 1. ...
- Selenium2学习-035-WebUI自动化实战实例-033-页面快照截图应用之三 -- 区域截图(专业版)
之前有写过两篇博文讲述了 WebUI 自动化测试脚本中常用的截图方法,敬请参阅如下所示链接: 浏览器显示区域截图 浏览器指定区域截图 那么当需要截取的区域不在浏览器显示窗口范围之内时,之前的方法显然无 ...
- Ioc-Autofac的使用
serveral IoC Framework has already exist on the market,Take account of compenhensive factor,Autofa ...