您的位置:首页 > 其它

HDU1233 还是畅通工程【最小生成树】

2017-10-10 21:20 323 查看
题意:

求出连接各个村庄最小的公路总长度,把最小公路总长度求出来。

思路:

最小生成树原理,带入数据求得。

代码:

prim:

#include<iostream>
#include<cstring>

using namespace std;
#define inf 0x3f3f3f3f

int main()
{
int n, i,j,b,c,d,min,a[105][105],visit[105],low[105];
while(cin>>n,n)
{
memset(visit,0,sizeof(visit));
int temp=n*(n-1)/2;
while(temp--)
{
cin>>b>>c>>d;
a[b][c]=a[c][b]=d;
}
visit[1]=1;int pos=1;  //第一次给low赋值
for(i=1;i<=n;++i)
{
if(i!=pos) low[i]=a[pos][i];
}
int result=0; //运行m-1次,因为至少需要m-1次才能把所有的城市连通
for(i=1;i<n;++i)
{
min=inf;
for(j=1;j<=n;++j)
{
if(!visit[j]&&min>low[j])
{
min=low[j];
pos=j;
}
}
result+=min;
visit[pos]=1;
for(j=1;j<=n;++j)
{
if(!visit[j]&&low[j]>a[pos][j])
{
low[j]=a[pos][j];
}
}
}
cout<<result<<endl;
}
return 0;
}


krusual:

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

struct node
{
int u,v,w;
};

node arr[10000];
int per[110],n;

bool cmp(node a,node b)
{
return a.w<b.w;
}

void init()
{
for(int i=1;i<=n;++i)
{
per[i]=i;
}
}

int find(int x)
{
if(x==per[x]) return x;
return per[x]=find(per[x]);
}

bool join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
per[fx]=fy;
return 1;
}
return 0;
}

int main()
{
int m;
while(cin>>n,n)
{
init();
m=n*(n-1)/2;
for(int i=0;i<m;++i)
{
cin>>arr[i].u>>arr[i].v>>arr[i].w;
}
sort(arr,arr+m,cmp);
int sum=0;
for(int i=0;i<m;++i)
{
if(join(arr[i].u,arr[i].v))
{
sum+=arr[i].w;
}
}
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: