描述
农夫约翰已经当选镇长了!他的一个运动承诺之一是将互联网连接到该地区的所有农场。当然,他需要你的帮助。
农夫约翰为他的农场订了高速连接,并将与其他农民分享他的连接。为了最大限度地降低成本,他希望将最小量的光纤连接到所有其他农场。
给出连接每对农场需要多少纤维的列表,您必须找到将所有纤维连接在一起所需的最小纤维量。每个农场必须连接到一些其他农场,使得数据包可以从任何一个农场流向任何其他农场。
任何两个农场之间的距离不会超过100,000。
输入
输入包括几种情况。对于每种情况,第一行包含农场数N(3 <= N <= 100)。以下行包含N x N个连续矩阵,其中每个元素显示从农场到另一个的距离。在逻辑上,它们是N行的N个空格分隔的整数。在物理上,它们的长度限制在80个字符之间,所以有些行继续到其他字符。当然,对角线将为0,因为距离农场i到自身的距离对于这个问题不是很有意思。
产量
对于每种情况,输出单个整数长度,它是连接整套农场所需的最小纤维长度之和。
样品输入
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
样品输出
28
代码
#include<stdio.h>
#include<string.h>
#define MAXN 210
int cost[MAXN][MAXN];
const int INF=0x3f3f3f3f;
int vis[MAXN];
int lowc[MAXN];
int prim(int cost[][MAXN],int n)//编号从1-n
{
int i,j,p;
int minc,res=0;
memset(vis,0,sizeof(vis));
vis[1]=1;
for(i=1;i<=n;i++)
lowc[i]=cost[1][i];
for(i=1;i<n;i++)
{
minc=INF;
p=-1;
for(j=1;j<=n;j++)
if(vis[j]==0&&minc>lowc[j])
{minc=lowc[j];p=j;}
if(minc==INF)return -1;
res+=minc;vis[p]=1;
for(j=1;j<=n;j++)
if(vis[j]==0&&lowc[j]>cost[p][j])
lowc[j]=cost[p][j];
}
return res;
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&cost[i][j]);
printf("%d\n",prim(cost,n));
}
return 0;
}