http://acm.hdu.edu.cn/showproblem.php?pid=2473 其实这题不用删点,只要增加一个点即可。 #include <iostream> using namespace std; const int M=1100000; int n,m,father[M],rank[M],id[M],ans; char s[5]; void init() { for(int i=0;i<M;i++) father[i]=i,rank[i]=1,id[i]=i; } int find(int x) { if(x!=father[x]) father[x]=find(father[x]); return father[x]; } void con(int x,int y) { int fx=find(x); int fy=find(y); if(rank[fx]>rank[fy]) { rank[fy]+=rank[fx];father[fx]=fy;rank[fx]=0; } else { rank[fx]+=rank[fy];father[fy]=fx;rank[fy]=0; } } int main() { int t=0; while(scanf("%d%d",&n,&m)&&(n+m)) { int i,j,a,b; init();ans=0; for(i=1;i<=m;i++) { scanf("%s",s); if(s[0]=='M') { scanf("%d%d",&a,&b); if(find(id[a])!=find(id[b])) con(id[a],id[b]); } else { scanf("%d",&a); rank[find(id[a])]--; n++; id[a]=n-1; } } for(i=0;i<n;i++) if(rank[i]>0) ans++; printf("Case #%d: %d/n",++t,ans); } return 0; }