N - Is It A Tree? POJ - 1308

题目大意:

       跟小希的迷宫差不多,其实这个题的代码我用小希的代码加了一个判断条件就AC了。

解题思路:

       看到别人的易错情况:

1、0 0 yes

2、1 1 0 0 no

3、1 2 1 2 0 0 no 

4、1 2 2 3 4 5 0 0 no (多个根结点)

5、1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 1 0 0  no(环?一个结点指向祖先)

6、1 2 2 1 0 0 no

参考代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <map>
 4 #include <string>
 5 #include <queue>
 6 #include <stack>
 7 #include <set>
 8 
 9 #include <cstdio>
10 #include <cstring>
11 #include <cmath>
12 #include <cstdlib>
13 using namespace std;
14 
15 const int INF=0x3f3f3f3f;
16 const int SIZE=1e5+10;
17 
18 set<int> st;  ///这个是为了两两查找的时候方便一点
19 int id[SIZE];
20 int sz[SIZE];
21 int count;
22 int find(int x)  ///找跟根结点
23 {
24     while(x!=id[x])
25     {
26         id[x]=id[id[x]];
27         x=id[x];
28     }
29     return x;
30 }
31 
32 int un(int p,int q)
33 {
34     int pr=find(p);
35     int qr=find(q);
36     if(pr==qr) return -1;
37     if(sz[pr]<=sz[qr])
38     {
39         sz[qr]+=sz[pr];id[pr]=qr;
40     }
41     else
42     {
43         sz[pr]+=sz[qr];id[qr]=pr;
44     }
45 }
46 
47 void clear()
48 {
49     for(int i=1;i<=SIZE;i++)
50     {
51         id[i]=i;sz[i]=1;
52     }
53     st.clear();
54 }
55 
56 int main()
57 {
58     int p,q;
59     int temp,flag;
60     int cas=1;
61     while(cin>>p>>q)
62     {
63         flag=0;
64         clear();
65         if(p==-1&&q==-1) break;
66         if(p==0&&q==0) {cout<<"Case "<<cas<<" is a tree.\n";cas++;continue;}///特判0 0的情况
67         if(p==q) flag=1;  ////*************小希的迷宫增加的唯一判断
68         st.insert(p);
69         st.insert(q);
70         un(p,q);
71         int mark=p;
72 
73         while(cin>>p>>q)
74         {
75             if(p==0&&q==0) break;
76             if(p==q) flag=1; //////////*******小希的迷宫增加的唯一判断
77             if(!flag)
78                 temp=un(p,q);
79             if(temp==-1) flag=1;
80             st.insert(p);st.insert(q);
81         }
82 
83         count=st.size();
84         if(sz[find(mark)]<count) flag=1;
85         if(flag==1) cout<<"Case "<<cas<<" is not a tree.\n";
86         else  cout<<"Case "<<cas<<" is a tree.\n";
87         cas++;
88     }
89     return 0;
90 }
91  

  

posted @ 2017-09-01 21:41  小可爱的小可爱  阅读(149)  评论(0编辑  收藏  举报