最大势算法直接判断弦图
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 2050
using namespace std;
int lab[N],vis[N],F[N][N],mark[N],tmp[N],cur;
int n,m;
void z() {
for (int _=n;_>=1;_--) {
memset(lab,0,sizeof(lab));
for (int i=1;i<=n;i++) if (vis[i])
for (int j=1;j<=n;j++) if (!vis[j] && F[i][j]) lab[j]++;
int mx = -1 , id = -1;
for (int i=1;i<=n;i++) if (!vis[i])
if (lab[i] > mx) mx = lab[i] , id = i;
mark[_] = id; vis[id] = 1;
}
}
bool check() {
for (int i=1;i<=n;i++) {
memset(tmp,0,sizeof(tmp)); cur = 0;
for (int j=i+1;j<=n;j++)
if (F[ mark[i] ][ mark[j] ]) tmp[++cur] = mark[j];
for (int j=2;j<=cur;j++) if (!F[tmp[1]][tmp[j]]) return false;
}
return true;
}
void init() {
memset(F,0,sizeof(F));
memset(mark,0,sizeof(mark));
memset(vis,0,sizeof(vis));
}
int main() {
for (;;) {
init();
scanf("%d%d",&n,&m);
if (n*m == 0) return 0;
for (int i=1;i<=m;i++) {
int u,v;
scanf("%d%d",&u,&v);
F[u][v] = F[v][u] = 1;
}
z();
bool ans = check();
if (ans) puts("Perfect"); else puts("Imperfect");
printf("\n");
}
return 0;
}