并查集判断连通性。
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<map> using namespace std; const int maxn=1010; struct Edge { int u,v; }e[maxn*maxn]; int n,m,k; int f[maxn]; int Find(int x) { if(x!=f[x]) return f[x]=Find(f[x]); return f[x]; } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=m;i++) scanf("%d%d",&e[i].u,&e[i].v); for(int i=1;i<=k;i++) { int id; scanf("%d",&id); int sz=n-1; for(int j=1;j<=n;j++) f[j]=j; for(int j=1;j<=m;j++) { if(e[j].u==id) continue; if(e[j].v==id) continue; int fx=Find(e[j].u); int fy=Find(e[j].v); if(fx!=fy) { f[fx]=fy; sz--; } } printf("%d\n",sz-1); } return 0; }