某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
当N为0时,输入结束,该用例不被处理。
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
3
5
Huge input, scanf is recommended.
两个代码有区别吗?为什么第一个能过第二个不能过?
Select Code
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10005;
struct node { int from,to,len;} edge[maxn];//储存边的数据结构
int n,fa[maxn],m,ans,q;
bool cmp(node a,node b) { return a.len<b.len; }//边按从小到大的顺序排列
int Find(int x)
{
if(fa[x]==x) return x;
return fa[x]=Find(fa[x]);
}
void Merge(int x,int y)
{
x=Find(x),y=Find(y);
if(x!=y) fa[y]=x;
}
int kruskal()
{
sort(edge,edge+m,cmp);//边排序
for(int i=0;i<=n;i++) fa[i]=i;//初始化并查集
ans=0;
for(int i=0;i<m;i++)//一条边的两个端点不在同一个集合,则选它,并合并端点
if(Find(edge[i].from)!=Find(edge[i].to)) Merge(edge[i].from,edge[i].to),ans+=edge[i].len;
return ans;
}
int main()
{
while(cin>>n,n)
{
m=n*(n-1)/2;
for(int i=0;i<m;i++) cin>>edge[i].from>>edge[i].to>>edge[i].len;
cout<<kruskal()<<endl;
}
return 0;
}
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=10005;
struct node //结构体
{
int from,to,len;
}edge[maxn];
int n,fa[maxn],m,ans,q;
bool cmp(node a,node b)
{
return a.len<b.len;
}
int Find(int x)
{
if(fa[x]==x)
return x;
return fa[x]=Find(fa[x]);
}
void Merge(int x,int y)
{
x=Find(x),y=Find(y);
if(x!=y)
fa[y]=x;
}
int Kruskal() //最小生成树
{
sort(edge,edge+m,cmp); //从小到大不是sort的默认的排序方法吗? (结构体?)
for(int i=0;i<n;i++) //初始化
fa[i]=i;
ans=0;
for(int i=0; i<m ;i++)
if(Find(edge[i].from)!=Find(edge[i].to)) //连接 避免成环
{
Merge(edge[i].from,edge[i].to);
ans+=edge[i].len; //计数
}
return ans;
}
int main()
{
while(cin>>n,n)
{
m=n*(n-1)/2;
for(int i=0 ; i<m ; i++)
cin>>edge[i].from>>edge[i].to>>edge[i].len;
cout<<Kruskal()<<endl;
}
return 0;
}