poj1258 - Agri-Net

                                   想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410
                                     转载请注明出处:
http://blog.csdn.net/wangjian8006

题目大意:有n个农场,已知这n个农场都互相相通,有一定的距离,现在每个农场需要装光纤,问怎么安装光纤能将所有农场都连通起来,并且要使光纤距离最小,输出安装光纤的总距离
解题思路:又是一个最小生成树,因为给出了一个二维矩阵代表他们的距离,直接算prim就行了

 

/*
prim
Memory 204K
Time   16MS 
*/
#include <iostream>
using namespace std;
#define MAXV 101
#define inf 1<<29

int map[MAXV][MAXV],n;

void prim(){
	int i,j,d[MAXV],vis[MAXV],mi,v;
	for(i=1;i<=n;i++){
		d[i]=map[1][i];
		vis[i]=0;
	}
	for(i=1;i<=n;i++){
		mi=inf;
		for(j=1;j<=n;j++)
			if(!vis[j] && d[j]<mi){
				mi=d[j];
				v=j;
			}
		vis[v]=1;
		for(j=1;j<=n;j++)
			if(!vis[j] && d[j]>map[v][j])
				d[j]=map[v][j];
	}
	for(d[0]=0,i=1;i<=n;i++) d[0]+=d[i];

	printf("%d\n",d[0]);
}

int main(){
	int i,j;
	while(~scanf("%d",&n)){
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				scanf("%d",&map[i][j]);
		prim();
	}
	return 0;
}


 

 

你可能感兴趣的:(poj1258 - Agri-Net)