从来学习并查集
#include#include using namespace std;//封装好的并查集 class UF{ //union find private: vector v;//存储各个结点 v[i]=j 表示 第i个结点的代表元是j(所在树的根结点) public: //初始化 UF(int n){ //初始化 总共有n个结点 刚开始的时候v[i]=i for(int i=0;i<=n;i++){ v.push_back(i); } } //根结点的查找 int Find(int x){ //查找x所在树的代表元(根结点) for(;;){ if(v[x]!=x) x=v[x]; else return x; } } //根结点的查找(递归) int Find2(int x){ //递归的方法来找根结点 if(v[x]==x) return x; else return Find2(v[x]); } //两棵树的合并 bool Union(int x,int y){ //把x和y合并 x=Find(x); y=Find(y); if(x==y) return false; else{ v[x]=y; return true; } } };int main(){ int n,m,src,dest,root,count; while(cin>>n&&n!=0){ UF uf(n);//n是城镇个数 m是当前公路个数 cin>>m; //输入边 构造并查集,并查集的构造 while(m--){ cin>>src>>dest;//输入边的两个顶点 if(uf.Find(src)!=uf.Find(dest)){ //如果这两个点不能连通, uf.Union(src,dest);//把这个量结点所在的树 合并 } } //逐个结点(城镇)检查是否连通,如果不连通就修一条路使她连通 count=0; root=uf.Find(1); for(int i=2;i<=n;i++){ if(UF.Find(i)!=root){ uf.Union(i,1); count++; } cout< <