比赛 |
至少完成十道练习 |
评测结果 |
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;
}