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 }
浙公网安备 33010602011771号