// C++Exercise.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
#include<string>
#include<stack>
#include<map>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<sstream>
using namespace std;
int n, m;
bool judge(vector<vector<int> >& graph,vector<int>& record,vector<int>& mark){
vector<int> v;
for (int i = n; i > 0; i--){
v.clear();
int index = record[i];
for (int j = 1; j <= n; j++){
if (graph[index][j] && mark[j] > i) v.push_back(j);
}
for (int j = 1; j < v.size(); j++){
if (mark[v[0]]>mark[v[j]]) swap(v[0], v[j]);
}
for (int j = 1; j < v.size(); j++){
if (!graph[v[0]][v[j]]) return false;
}
}
return true;
}
int main(){
while (cin>>n>>m){
if (n == 0 && m == 0) break;
vector<vector<int> > graph(n+1,vector<int>(n+1,0));
for (int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
graph[a][b] = 1;
graph[b][a] = 1;
}
vector<int> degree(n+1,0);
vector<int> visit(n+1,0);
vector<int> mark(n+1,0);
vector<int> record(n+1, 0);
for (int i = n; i > 0; i--){
int u = -1;
int index;
for (int j = 1; j <= n; j++){
if (!visit[j] && degree[j] > u){
index = j;
u = degree[j];
}
}
visit[index] = 1;
mark[index] = i;//p
record[i] = index;//a
for (int j = 1; j <= n; j++){
if (graph[index][j] && !visit[j]) degree[j]++;
}
}
if (judge(graph, record, mark)) cout << "Perfect" << endl;
else cout << "Imperfect" << endl;
cout << endl;
}
return 0;
}
zoj 1015
最新推荐文章于 2022-02-01 17:30:08 发布