并查集--畅通工程(浙大计算机研究生复试上机考试-2005年 )

畅通工程
这是一道简单的并查集。
不懂并查集的点进来
通过并查集的每一次合并,最后看看有多少个集合,有多少集合就是有多少不连通的城市,最后总集合数减一,就是需要新修的路

#include <iostream>
#include <vector>
#include <set>
using namespace std;
vector<int> g;
int find(int x)
{
 if (g[x]!=x)
 {g[x]=find(g[x]);
 }
 return g[x];
}
int main()
{
 int n;
 while(cin>>n)
 {
  if(n==0)
      break;
  g.resize(n+1);//初始化 
  for(int i=1;i<=n;i++)
   g[i]=i;
  int m;
  cin>>m;
  for (int i=1;i<=m;i++)
  {int x,y;
  cin>>x>>y;
  x=find(x);
  y=find(y);
  if(x!=y)
  g[x]=y;
  }
  for (int i=1;i<=n;i++)
  find(i);
  set<int> a(g.begin()+1,g.end());
  cout<<a.size()-1<<endl;
 }
 return 0;
}
发布了44 篇原创文章 · 获赞 4 · 访问量 1072

猜你喜欢

转载自blog.csdn.net/qq_44162236/article/details/102780131