题意:裸的弦图的判定:

弦图定义:给出一个无向连通图,如果每个环中都存在至少一条弦(环中存在不相邻的两点直接相连)这样的图叫做弦图;

转载: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)的更多相关文章

  1. BZOJ1006 神奇的国度 【弦图染色——最大势算法MCS】

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 4146  Solved: 1916 [Submit][S ...

  2. bzoj 1006: [HNOI2008]神奇的国度 -- 弦图(最大势算法)

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MB Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角 ...

  3. ZOJ 1015 弦图判定

    一些定义: 弦图是一种特殊图:它的所有极小环都只有3个顶点. 单纯点:该顶点与其邻接点在原图中的导出子图是一个完全图. 图G的完美消去序列:一个顶点序列a1a2a3...an,使得对于每个元素ai,a ...

  4. bzoj 1242 弦图判定 MCS

    题目大意: 给定一张无向图,判断是不是弦图. 题解: 今天刚学了<弦图与区间图> 本来写了一个60行+的学习笔记 结果因为忘了保存重启电脑后被还原了... 那就算了吧. MCS最大势算法, ...

  5. [bzoj1242] Zju1015 Fishing Net弦图判定

    弦图判定..MCS算法. 先选一个点,然后每次拿 相邻已选点最多 的未选点. 选完之后判断一下是否是完美消除序列. #include<cstdio> #include<iostrea ...

  6. BZOJ 1006 完美消除序列&最大势算法&弦图

    K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在.所谓N边关系 ...

  7. ZOJ 1015 Fishing Net(弦图判定)

    In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...

  8. bzoj 1242: Zju1015 Fishing Net 弦图判定

    1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 214  Solved: 81[Submit ...

  9. bzoj 1006 [HNOI2008]神奇的国度 弦图+完美消除序列+最大势算法

    [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4370  Solved: 2041[Submit][Status][D ...

随机推荐

  1. sql server 数据库连接配置在外面 如何读取

    注意:web运行读取要把配置文件放在WEB-INF下面 Driver=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver:// ...

  2. 区分总结innerHeight与clientHeight、innerWidth与clientWidth、scrollLeft与pageXOffset等属性

    window对象: (1)innerHeight属性:窗口中文档显示区域的高度,不包括菜单栏.工具栏等部分.该属性可读可写. IE不支持该属性,IE中body元素的clientHeight属性与该属性 ...

  3. JavaScript中的prototype

    关于prototype: 理解prototype不应把它和继承混淆.A的prototype为B的一个实例,可以理解A将B中的方法和属性全部克隆了一遍.A能使用B的方法和属性.这里强调的是克隆而不是继承 ...

  4. (转)freemakeer初入门

    在web开发过程中,尤其是后台管理系统的开发中,少不了增删改成的基础操作,原来我自己的做法是一份一份的拷贝粘贴,然后修改其中的不同,然而这样既枯燥无味又浪费了大量的时间,所以根据自己项目结构的特点写了 ...

  5. php--memcahce安装

    安装php_memcache.dll扩展 1.首先将php_memcache.dll文件放入E:\server\php\ext目录下 (php_memcache.dll下载地址:http://wind ...

  6. Nagios Looking Glass 本地文件包含漏洞

    漏洞名称: Nagios Looking Glass 本地文件包含漏洞 CNNVD编号: CNNVD-201310-682 发布时间: 2013-10-31 更新时间: 2013-10-31 危害等级 ...

  7. [LeetCode] Decode Ways(DP)

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  8. [LeetCode]题解(python):041-First Missing Positive

    题目来源 https://leetcode.com/problems/first-missing-positive/ Given an unsorted integer array, find the ...

  9. windows7 密码保护 共享文件

    windows7 密码保护 共享文件 2台windows7之间设置文件共享,本想使用ftp,但是配置指定用户连接,配置权限比较繁琐. 所以就想到使用window7的文件共享,并设置密码,共享整个硬盘的 ...

  10. Quartz的配置文件quartz.properties详解

    配置 quartz.properties 文件 文件 quartz.properties 定义了 Quartz 应用运行时行为,还包含了许多能控制 Quartz 运转的属性.这个文件应该放在class ...