比赛 至少完成十道练习 评测结果 AAAAAAAAAA
题目名称 最优布线问题 最终得分 100
用户昵称 Ostmbh 运行时间 0.439 s
代码语言 C++ 内存使用 8.93 MiB
提交时间 2017-05-20 21:40:10
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int Max=100000000;
int dis[1502][1502];
int Min[1502];
int vis[1502]={0};
inline void read(int &x){
	x=0;
	bool flag=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')
			flag=1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	if(flag)
		x=-x;
}
int main(){
	freopen("wire.in","r",stdin);
	freopen("wire.out","w",stdout);
	int ans=0;
	int n,x;
	read(n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			read(x);
			if(x==-1)
				dis[i][j]=Max;
			else 
				dis[i][j]=x;
		}
	Min[i]=Max;
	}
	Min[1]=0;
	for(int i=1;i<=n;i++){
		int u=-1,min1=Max;
		for(int j=1;j<=n;j++)
			if(Min[j]<min1&&vis[j]==0){
				u=j;
				min1=Min[j];
			}
		if(u==-1)
			break;
		vis[u]=1;
		ans+=Min[u];
		for(int j=1;j<=n;j++){
			if(j!=u&&vis[j]==0)
				if(dis[u][j]<Min[j])
					Min[j]=dis[u][j];
		}
	}
	printf("%d\n",ans);
return 0;
}