forked from daiwb/Algorithm
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1015Fishing Net.cpp
More file actions
111 lines (102 loc) · 1.97 KB
/
1015Fishing Net.cpp
File metadata and controls
111 lines (102 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
* ZOJ 1015 Fishing Net
*
* 2005/05/04 By adai
*/
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <list>
#include <deque>
#include <set>
using namespace std;
#ifdef WIN32
#define for if(0); else for
#endif
//quick sort
int cmp(const void *t1, const void *t2) {
int *a, *b;
a = (int*)t1;
b = (int*)t2;
return (*b) - (*a);
}
#define MAXN 1001
int n, line;
int adj[MAXN][MAXN], adjNum[MAXN];
int label[MAXN], num[MAXN], numI[MAXN];
int m[MAXN];
int maximum_cardinality_search() {
memset(label, 0, sizeof(label));
for (int i = n; i >= 1; --i) {
int v = n + 1, tmp = -1;
for (int j = n; j >= 1; --j) {
if (num[j] == 0 && label[j] > tmp) {
tmp = label[j], v = j;
}
}
num[v] = i;
numI[i] = v;
for (int j = 0; j < adjNum[v]; ++j) {
int w = adj[v][j];
if (num[w] == 0) ++label[w];
}
}
return 0;
}
int perfect_elimination_order() {
for (int i = 1; i <= n - 1; ++i) {
int v = numI[i], w, first = 1;
for (int j = 0; j < adjNum[v]; ++j) {
w = adj[v][j];
if (num[w] > num[v]) {
if (first) {
first = 0;
m[v] = w;
}
else {
if (num[w] < num[m[v]]) m[v] = w;
}
}
}
for (int j = 0; j < adjNum[v]; ++j) {
w = adj[v][j];
if (num[m[v]] < num[w]) {
int flag = 0;
for (int k = 0; k < adjNum[m[v]]; ++k) {
if (w == adj[m[v]][k]) {
flag = 1;
break;
}
}
if (flag == 0) return 0;
}
}
}
return 1;
}
int Run() {
memset(adjNum, 0, sizeof(adjNum));
memset(num, 0, sizeof(num));
while (line--) {
int a, b;
scanf("%d %d", &a, &b);
adj[a][adjNum[a]++] = b;
adj[b][adjNum[b]++] = a;
}
for (int i = 1; i <= n; ++i) qsort(adj[i], adjNum[i], sizeof(int), cmp);
maximum_cardinality_search();
if (perfect_elimination_order()) printf("Perfect\n\n");
else printf("Imperfect\n\n");
return 0;
}
int main() {
while (scanf("%d %d", &n, &line) && n + line) {
Run();
}
return 0;
}