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