Description
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n <= 100, m <=10000)
剩下m行每行3个非负整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c(城市编号从1到n)。
Output
每组输出占一行,仅输出最小花费。
Sample
Input
3 2
1 2 1
1 3 1
1 0
Output
2
0
答案:
Kruskal:
#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define INF 0x3f3f3f3f
const int N = 11111;
using namespace std;
struct node
{
int u;
int v;
int w;
} p[N];
int vis[N];
bool cmp(node x,node y)
{
return x.w<y.w;
}
void init(int n)
{
int i;
for(i=1; i<=n; i++)
{
vis[i]=i;
}
}
int Find(int i)
{
if(vis[i]!=i)
vis[i]=Find(vis[i]);
return vis[i];
}
bool Merge(int u,int v)
{
int t1=Find(u);
int t2=Find(v);
if(t1==t2)
return true;
else
{
vis[t2]=t1;
return false;
}
}
int main()
{
ios::sync_with_stdio(0);
int n,m;
while(cin>>n>>m)
{
init(n);
int i;
for(i=1; i<=m; i++)
{
cin>>p[i].u>>p[i].v>>p[i].w;
}
sort(p+1,p+1+m,cmp);
int ans=0;
for(i=1; i<=m; i++)
{
if(!Merge(p[i].u,p[i].v))
{
ans+=p[i].w;
//cnt++;
}
}
cout<<ans<<endl;
}
return 0;
}