1078 最小生成树 -- prime

1078 最小生成树

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 白银 Silver
题解
题目描述 Description

农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。 你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。 每两个农场间的距离不会超过100000

输入描述 Input Description

第一行: 农场的个数,N(3<=N<=100)。

第二行..结尾: 接下来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们每行限制在80个字符以内,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为线路从第i个农场到它本身的距离在本题中没有意义。

输出描述 Output Description

只有一个输出,是连接到每个农场的光纤的最小长度和。

样例输入 Sample Input

4

0  4  9 21

4  0  8 17

9  8  0 16

21 17 16  0

样例输出 Sample Output

28

http://codevs.cn/problem/1078/
#include <cstdio>  
#include <sstream>  
#include <cstring>  
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

#define  N 105
#define INF 99999999
int n ;

int diss[N][N] ;

bool vis[N] ;
int low[N] ;

void prime()
{
	int i;
	int newP = 0 ;
	for(i = 0 ; i< n ;i++)
	{
		vis[i] = false;
		low[i] = diss[newP][i];
	}
	vis[newP] = true ;
	low[newP] = 0 ;

	int sums = 0 ;
	int num = 1 ;
	
	while(num != n)
	{
		int minn = INF ;
		for(i = 0 ;i < n ; i++)
		{
			if(!vis[i])
			{
				if(low[i] < minn)
				{
					minn = low[i] ;
					newP = i ;
				}
			}
		}
		if(minn == INF)
			break ;
		num ++ ;
		sums += low[newP] ; // 在更新low[i]之前 sums加上距离
		for(i = 0 ;i < n ; i++) // 更新low[i]
		{
			if(!vis[i] && diss[newP][i] < low[i])
			{
				low[i] = diss[newP][i] ;
			}
		}
		vis[newP] = true ;
	}
	printf("%d\n",sums) ;
}
int main()
{
	scanf("%d" , &n);
	int i , j ;
	for(i=0;i<n;i++)
	{
		for(j = 0; j< n;j++)
		{
			scanf("%d",&diss[i][j]) ;
		}
	}
	prime();
	return 0 ;
}


你可能感兴趣的:(1078 最小生成树 -- prime)