记录编号 231325 评测结果 AAAAAAAAAA
题目名称 最优布线问题 最终得分 100
用户昵称 GravatarGo灬Fire 是否通过 通过
代码语言 C++ 运行时间 1.687 s
提交时间 2016-02-26 09:59:30 内存使用 9.48 MiB
显示代码纯文本
#include<cmath>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1550;
int ans=0,n,c[maxn][maxn];
void Init();
void Prim(int);
int main(){
	freopen("wire.in","r",stdin);
	freopen("wire.out","w",stdout);
	Init();
	printf("%d",ans);
	return 0;
}
void Init(){
	memset(c,0,sizeof(c));
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int x;
			scanf("%d",&x);
			c[i][j]=c[j][i]=x;
		}
	}
	
	Prim(1);
}
void Prim(int x)
{
	int dis[maxn]={0};
	bool f[maxn]={0};
	dis[x]=0;f[x]=1;
	for(int i=1;i<=n;i++){
		dis[i]=c[x][i];
	}
	int sum=1;
	while(sum<n){
		int _min=0x7f7f7f7f,j;
		for(int i=1;i<=n;i++){
			if(!f[i] && dis[i]<_min){
				_min=dis[i];
				j=i;
			}
		}
		sum++;
		ans+=dis[j];
		f[j]=1;
		for(int i=1;i<=n;i++){
			if(!f[i] && dis[i]>c[j][i])dis[i]=c[j][i];
		}
	}
}