PAT1013 Battle Over Cities

题目:PAT1013

 

题解:裸的并查集,大佬在前阵子刚刚讲过,附上一个个人觉得讲的十分好的博客 并查集详解

   某个城市陷入战争,也就相当于把这个点去除后做并查集,然后查看有多少分支。

   最后一个点一直报段错误...又是数组开小了...有n个顶点的强连通图有n(n-1)条路径,我最刚开始只开了n条...

 

代码:

 1 #include<cstdio>
 2 #define maxn 1005
 3 using namespace std;
 4 
 5 int x[maxn*maxn],y[maxn*maxn],par[maxn],tar[maxn],city,n,m,k;
 6 
 7 int findx(int x)
 8 {
 9     return par[x]==x?x:findx(par[x]);
10 }
11 
12 void unionx(int x,int y)
13 {
14     x=findx(x);y=findx(y);
15     if(tar[x]<tar[y])
16     {
17         par[x]=y;
18     }
19     else
20     {
21         par[y]=x;
22         if(tar[x]==tar[y]) tar[x]++;
23     }
24 }
25 
26 void init()
27 {
28     for(int i=1;i<=n;i++)
29     {
30         par[i]=i;
31         tar[i]=0;
32     }
33 }
34 
35 int main()
36 {
37     scanf("%d%d%d",&n,&m,&k);
38 
39     int sum;
40     for(int i=1;i<=m;i++)
41         scanf("%d%d",&x[i],&y[i]);
42 
43     for(int i=0;i<k;i++)
44     {
45         scanf("%d",&city);
46 
47         init();
48 
49         for(int j=1;j<=m;j++)
50         {
51             if(x[j]!=city&&y[j]!=city)
52             {
53                 unionx(x[j],y[j]);
54             }
55         }
56 
57         sum=0;
58 
59         for(int j=1;j<=n;j++)
60         {
61             if(j!=city&&par[j]==j) sum++;
62         }
63 
64         printf("%d\n",sum-1);
65     }
66 
67     return 0;
68 }

 

   

posted on 2017-03-09 13:51  RocSAMA  阅读(111)  评论(0)    收藏  举报