POJ 1258

一水,最小生成树,缓解心情

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf=(1<<31)-1;
int map[110][110];
int lowest[110];
bool vis[110];

void init(int n){
	for(int i=1;i<=n;i++)
	lowest[i]=inf;
	memset(vis,false,sizeof(vis));
}

void slove(int n){
	lowest[1]=0;
	for(int i=2;i<=n;i++)
	lowest[i]=map[1][i];
	vis[1]=true;
	for(int i=1;i<=n;i++){
		int pos=-1,minc=inf;
		for(int k=1;k<=n;k++){
			if(!vis[k]&&minc>lowest[k]){
				minc=lowest[k]; pos=k;
			}
		}
	//	cout<<minc<<' '<<pos<<endl;
		if(pos==-1) break;
		vis[pos]=true;
		for(int k=1;k<=n;k++){
			if(!vis[k]){
				if(lowest[k]>map[pos][k])
				lowest[k]=map[pos][k];
			}
		}
	}
}

int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++)
			scanf("%d",&map[i][j]);
		}
		init(n);
		slove(n);
		int ans=0;
		for(int i=1;i<=n;i++)
		ans+=lowest[i];
		printf("%d\n",ans);
	}
	return 0;
}

  

posted @ 2015-02-12 17:05  chenjunjie1994  阅读(134)  评论(0编辑  收藏  举报