题目:http://pat.zju.edu.cn/contests/pat-a-practise/1013
题解:
题意就是给N个城市(1~N),再给M条连接两个城市的路,最后问把某个城市去除后需要添加多少条路才能把所有城市连起来。
题解就是赤果果的并查集,每次询问城市的时候把那个城市去除,然后进行一次并查集再统计。
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<string> #include<vector> #include<queue> #include<stack> #include<algorithm> using namespace std; #define MAX 1005 int mapx[MAX*MAX][2]; int pre[MAX]; int Find(int x) { return pre[x]==x?x:pre[x]=Find(pre[x]); } void Union(int x,int y) { x=Find(x); y=Find(y); if(x==y) return ; pre[y]=x; } int main() { int n,m,k,a,summ; memset(mapx,0,sizeof(mapx)); scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;++i) scanf("%d%d",&mapx[i][0],&mapx[i][1]); for(;k--;) { scanf("%d",&a); for(int i=0;i<=n;++i) pre[i]=i; for(int i=0;i<m;++i) if(mapx[i][0]!=a&&mapx[i][1]!=a) Union(mapx[i][0],mapx[i][1]); summ=0; for(int i=1;i<=n;++i) if(pre[i]==i&&i!=a) ++summ; printf("%d\n",summ-1); } return 0; }