题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1272
并查集
1 #include <iostream>
2 #include <algorithm>
3
4 using namespace std;
5
6 int f[100001];
7 bool dis[100001];
8
9 int Find(int x)
10 {
11 while( x != f[x] ){
12 x = f[x];
13 }
14
15 return x;
16 }
17
18 int Union(int x, int y)
19 {
20 if( x == y ){
21 return 0;
22 }
23 if( x < y ){
24 f[x] = y;
25 }
26 else{
27 f[y] = x;
28 }
29 return 1;
30 }
31
32 int main()
33 {
34 int s, e, flag;
35 int sn, en, temp;
36
37 for(int i=0; i<100001; i++){
38 f[i] = i;
39 dis[i] = false;
40 }
41 flag = true; sn = 100001; en = 0;
42 while( scanf("%d%d", &s, &e), ( s != -1 || e != - 1 ) ){
43 if( s + e == 0 ){
44 if( flag ){
45 temp = Find(sn);
46 for(int i=sn+1; i<=en; i++){
47 if(dis[i] && temp != Find(i)){
48 flag = false;
49 break;
50 }
51 }
52 }
53 printf("%s\n", flag ? "Yes" : "No");
54 for(int i=sn; i<=en; i++){
55 f[i] = i;
56 dis[i] = false;
57 }
58 sn = 100001; en = 0;
59 flag = true;
60 continue;
61 }
62 dis[e] = dis[s] = true;
63 sn = min(sn, s);
64 sn = min(sn, e);
65 en = max(en, s);
66 en = max(en, e);
67 if( flag ){
68 flag = Union(Find(s), Find(e));
69 }
70 }
71
72 return 0;
73 }
2 #include <algorithm>
3
4 using namespace std;
5
6 int f[100001];
7 bool dis[100001];
8
9 int Find(int x)
10 {
11 while( x != f[x] ){
12 x = f[x];
13 }
14
15 return x;
16 }
17
18 int Union(int x, int y)
19 {
20 if( x == y ){
21 return 0;
22 }
23 if( x < y ){
24 f[x] = y;
25 }
26 else{
27 f[y] = x;
28 }
29 return 1;
30 }
31
32 int main()
33 {
34 int s, e, flag;
35 int sn, en, temp;
36
37 for(int i=0; i<100001; i++){
38 f[i] = i;
39 dis[i] = false;
40 }
41 flag = true; sn = 100001; en = 0;
42 while( scanf("%d%d", &s, &e), ( s != -1 || e != - 1 ) ){
43 if( s + e == 0 ){
44 if( flag ){
45 temp = Find(sn);
46 for(int i=sn+1; i<=en; i++){
47 if(dis[i] && temp != Find(i)){
48 flag = false;
49 break;
50 }
51 }
52 }
53 printf("%s\n", flag ? "Yes" : "No");
54 for(int i=sn; i<=en; i++){
55 f[i] = i;
56 dis[i] = false;
57 }
58 sn = 100001; en = 0;
59 flag = true;
60 continue;
61 }
62 dis[e] = dis[s] = true;
63 sn = min(sn, s);
64 sn = min(sn, e);
65 en = max(en, s);
66 en = max(en, e);
67 if( flag ){
68 flag = Union(Find(s), Find(e));
69 }
70 }
71
72 return 0;
73 }
几个初始化变量写错了,搞的我w了好几次!