小希的迷宫
1 #include <iostream>
2 using namespace std;
3
4 int p[100010];
5 bool v[100010];
6
7 void make_set()
8 {
9 for(int i = 0; i < 100010; ++i)
10 {
11 p[i] = i;
12 v[i] = false;
13 }
14 }
15
16 int find_set(int x)
17 {
18 if(p[x] != x)
19 p[x] = find_set(p[x]);
20 return p[x];
21 }
22
23 void union_set(int x, int y)
24 {
25 x = find_set(x);
26 y = find_set(y);
27 if(x != y)
28 p[y] = x;
29 }
30
31 int main()
32 {
33 int a, b, x, y, count = 0, k = 0;
34 bool flag = true;
35 make_set();
36 while(scanf("%d%d", &a, &b) && (a != -1 || b != -1))
37 {
38 if(a == 0 && b == 0)
39 {
40 for(int i = 1; i < 100010; ++i)
41 if(v[i] && p[i] == i)
42 count++;
43 if(count == 1 && flag || k == 0)
44 cout << "Yes" << endl;
45 else
46 cout << "No" << endl;
47 make_set();
48 flag = true;
49 count = 0;
50 k = 0;
51 }
52 else// if(flag)
53 {
54 k++;
55 v[a] = v[b] = true;
56 x = find_set(a);
57 y = find_set(b);
58 if(x == y)
59 flag = false;
60 else// if(y == b)
61 {
62 union_set(x, y);
63 }
64 /*
65 else if(a == x)
66 {
67 union_set(b, a);
68 }
69 else
70 {
71 union_set(x, y);
72 }
73 */
74 }
75 }
76 return 0;
77 }
78
79 /*
80 6 8 5 3 5 2 6 4
81 5 6 0 0
82
83 8 1 7 3 6 2 8 9 7 5
84 7 4 7 8 7 6 0 0
85
86 3 8 6 8 6 4
87 5 3 5 6 5 2 0 0
88
89 */
并查集,模仿之后找到点感觉了

浙公网安备 33010602011771号