水。。。。求集合个数-1就行= = #include<cstdio> #include<stdlib h=""> #include<string h=""> #include<string> #include<cmath> #include<cstring> #include<algorithm> #include<map> #include<set> #include<queue> #include<vector> using namespace std; int f[5005]; int find(int x) { if(x==f[x]) return x; else return f[x]=find(f[x]); } bool same(int x,int y) { x=find(x); y=find(y); if(x==y) return true; else return false; } void unite(int x,int y) { x=find(x); y=find(y); f[x]=y; } int main() { map<int int=""> x; // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); int n,m,i,a,b; while(scanf("%d%d",&n,&m)!=EOF){ if(n==0) break; x.clear(); for(i=1;i<=n;i++) f[i]=i; for(i=0;i<m;i++){ scanf("%d%d",&a,&b); unite(a,b); } for(i=1;i<=n;i++) { int k=find(i); x[k]=1; } printf("%d\n",x.size()-1); } return 0; } </int></vector></queue></set></map></algorithm></cstring></cmath></string></string></stdlib></cstdio>