手机
当前位置:查字典教程网 >编程开发 >C语言 >弦图ZOJ 1015 Fishing Net 判定方法
弦图ZOJ 1015 Fishing Net 判定方法
摘要:做题思路:1弦图,看了一个周末有木有!太弱了点,算法完全按照CDQ的PPT上给的最大势算法(MCS)求完美消除序列。前前后后sumbit了1...

做题思路:

1 弦图,看了一个周末有木有!太弱了点,算法完全按照CDQ的PPT上给的最大势算法(MCS)求完美消除序列。前前后后sumbit了19次,为WA提供了大量分母啊。。。。 多写点为自己备份吧。

2 有用的资料:

3 定理:一个图是弦图当且仅当它有一个完美消除序列。所以要先搞到完美消除序列:

弦图ZOJ 1015 Fishing Net 判定方法1

4 如何判断搞到的是不是完美消除序列:

弦图ZOJ 1015 Fishing Net 判定方法2

贴代码:(V*V的复杂度。。。)

复制代码 代码如下:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <algorithm>

using namespace std;

const int maxn=1000+10;

int gra[maxn][maxn];

int n, m;

int label[maxn], temp[maxn], num[maxn];

void numberVertex()

{

int i, j;

//label[n]=0, num[n]=1;

for(i=n; i>=1; i--)

{

int mm=-1, pos;

for(j=1; j<=n; j++)

{

if( !num[j] && label[j]>mm)

{

mm=label[j];

pos=j;

}

}

num[pos]=i;

for(j=1; j<=n; j++)

{

if( !num[j] && ( gra[pos][j] || gra[j][pos] ) )

label[j]++;

}

}

return ;

}

int check()

{

int i, j, flag=1;

for(i=1; i<=n && flag; i++)

{

memset(temp,0,sizeof(temp));

int len=0;

for(j=1; j<=n; j++)

{

if( num[i]<num[j] && gra[ i ][ j ] )

{

temp[len++]=j;

}

}

for(j=1; j<len; j++)//在此WA了一天有木有。。。

if(num[ temp[0] ]>num[ temp[j] ])

swap(temp[0], temp[j]);

for(j=1; j<len; j++)

if( !gra[ temp[0] ][ temp[j] ] )

{

flag=0;

break;

}

}

return flag;

}

int main()

{

while( scanf("%d %d",&n,&m)!=EOF )

{

if(n==0 && m==0)

break;

memset(label,0,sizeof(label));

memset(num,0,sizeof(num));

memset(gra,0,sizeof(gra));

for(int i=0; i<m; i++)

{

int x, y;

scanf("%d %d",&x, &y);

gra[x][y]=gra[y][x]=1;

}

numberVertex();

if( check() )

puts("Perfectn");

else

puts("Imperfectn");

}

return 0;

}

【弦图ZOJ 1015 Fishing Net 判定方法】相关文章:

解析如何在C语言中调用shell命令的实现方法

C++ sizeof 实例解析

用位图排序无重复数据集实例代码(C++版)

解决不用sizeof求出int大小的方法

linux c程序中获取shell脚本输出的实现方法

对C语言中递归算法的深入解析

C++派生类与基类的转换规则

基于Protobuf C++ serialize到char*的实现方法分析

linux c 获取本机公网IP的实现方法

C++ using namespace std 用法深入解析

精品推荐
分类导航