-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrace3.cpp
87 lines (81 loc) · 1.54 KB
/
race3.cpp
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
/*
TASK:race3
LANG:C++
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct Edge
{
int from, to, next;
Edge() {}
Edge(int u, int v):from(u), to(v) {}
}edges[105];
int first[55], ans1[55], ans2[55];
int n, tots, len1, len2;
bool v[55], vt[55];
void add(int u, int v)
{
edges[tots]=Edge(u, v);
edges[tots].next = first[u];
first[u] = tots++;
}
void DFS1(int x)
{
if (!v[x]) return;
v[x] = false;
for (int i = first[x]; i != -1; i = edges[i].next)
DFS1(edges[i].to);
}
bool DFS2(int x)
{
if (!v[x]) return false;
if (!vt[x]) return true;
vt[x] = false;
bool flag = true;
for (int i = first[x]; i != -1; i = edges[i].next)
flag = flag && DFS2(edges[i].to);
return flag;
}
int main()
{
freopen("race3.in", "r", stdin);
freopen("race3.out", "w", stdout);
n = 0;
tots = 0;
memset(first, -1, sizeof(first));
while (true)
{
int x;
scanf("%d", &x);
if (x == -1) break;
while (true)
{
if (x == -2) break;
add(n, x);
scanf("%d", &x);
}
++n;
}
--n;
len1 = len2 = 0;
for (int i = 0; i <= n; ++i)
{
memset(v, true, sizeof(v));
memset(vt, true, sizeof(vt));
v[i] = false;
DFS1(0);
if (v[n] && i != 0) ans1[len1++] = i;
v[i] = true;
if (DFS2(i) && i != 0 && i != n) ans2[len2++] = i;
}
printf("%d", len1);
for (int i = 0; i < len1; ++i) printf(" %d",ans1[i]);
printf("\n");
printf("%d", len2);
for (int i = 0; i < len2; ++i) printf(" %d", ans2[i]);
printf("\n");
//system("pause");
return 0;
}