题目链接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了好几次!