这道题目是裸的弦图的判断,弦图的定义和算法.是一道图论题目
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,m,v[1001];
bool g[1001][1001],vst[1001];
void mark()
{
memset(v,-1,sizeof(v));
memset(vst,0,sizeof(vst));
v[n]=1;vst[1]=1;
for(int i=n-1;i>=1;i--)
{
int id=-1,mmax=-1;
for(int j=2;j<=n;j++)
{
if(!vst[j])
{
int num=0;
for(int k=n;k>i;k--)
{
if(g[j][v[k]]) num++;
}
if(num>mmax)
{
mmax=num;id=j;
}
}
}
v[i]=id;vst[id]=1;
}
}
int jeo[1001];
bool judge()
{
mark();
for(int i=1;i<=n;i++)
{
int cnt=0;
for(int j=1+i;j<=n;j++)
{
if(g[v[i]][v[j]]) jeo[cnt++]=v[j];
}
for(int j=1;j<cnt;j++)
{
if(!g[jeo[0]][jeo[j]]) return false;
}
}
return true;
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n||m))
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
g[i][j]=0;
}
}
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
g[a][b]=g[b][a]=1;
}
if(judge())
{
printf("Perfect\n\n");
}
else
{
printf("Imperfect\n\n");
}
}
return 0;
}