http://ac.jobdu.com/problem.php?pid=1347
孤岛连通问题的实质就是求图的最小生成树问题,若非连通图就输出no。这里使用的是Kruskal算法,将所有边排序后,依次判断是否能让不连通的两定点连通,若可以,则并入该边,把该边的代价算入总代价。最后输出从代价,即最小代价,如不连通,则为no,判断连通用到了并查集。代码如下
#include <stdio.h>
#include <algorithm>
using namespace std;
struct road
{
int a,b,d;
bool operator < (const road &x) const
{
return d<x.d;
}
}road[10001];
int root[1001];
int getroot(int x)
{
if (root[x]==-1) return x;
else
{
int temp=getroot(root[x]);
root[x]=temp;
return temp;
}
}
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int n,m;
while (scanf("%d %d",&n,&m)!=EOF)
{
for (int i=0;i<=n;++i) root[i]=-1;
for (int i=0;i<m;++i)
scanf("%d %d %d", &road[i].a,&road[i].b,&road[i].d);
sort(road,road+m);
int cost=0;
for (int i=0;i<m;++i)
{
int a=getroot(road[i].a);
int b=getroot(road[i].b);
if (a!=b)
{
root[a]=b;
cost+=road[i].d;
}
}
int cnt=0;
for (int i=1;i<=n;++i)
if (root[i]==-1) ++cnt;
if (cnt==1) printf("%d\n",cost);
else printf("no\n");
}
return 0;
}