求连通分量个数,并查集基础题。
1 #include <iostream> 2 #define MAXN 1001 3 using namespace std; 4 int uset[MAXN]; 5 int Find(int x){return uset[x]==x?x:uset[x]=Find(uset[x]);} 6 void makeSet(int x,int y){ 7 int fx=Find(x),fy=Find(y); 8 if(fx!=fy) 9 uset[fy]=fx; 10 } 11 int main() 12 { 13 int T;cin>>T; 14 while(T--){ 15 int x,y,num,line,ans=0; 16 cin>>num>>line; 17 for(int i=1;i<=num;i++) uset[i]=i; 18 19 while(line--) 20 cin>>x>>y,makeSet(x,y); 21 for(int i=1;i<=num;i++) 22 if(i==uset[i]) 23 ans++; 24 cout << ans << endl; 25 } 26 27 return 0; 28 }
第九行是一开始出错的原因:Find函数已经将x指向了根节点,所以合并时如果根节点不同应该将其中一个的根节点指向另一个根节点完成合并,一开始写
uset[y]=fx;
显然不正确。
检查代码时每一个细节都要注意了。