比赛 防止浮躁的小练习V0.1 评测结果 AAAAAAAAAA
题目名称 通信线路 最终得分 100
用户昵称 Hzoi_Go灬Fire 运行时间 0.533 s
代码语言 C++ 内存使用 9.48 MiB
提交时间 2016-10-07 16:39:02
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1550;
int n,ans=0;
int c[maxn][maxn]={0};
void Prim(int);
void Init();
int main(){
	freopen("mcst.in","r",stdin);
	freopen("mcst.out","w",stdout);
	Init();
	printf("%d\n",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);
    		if(x==-1)c[i][j]=c[j][i]=0x7f7f7f7f;
    		else c[i][j]=c[j][i]=x;
    	}
    }
    Prim(1);
}
void Prim(int x)
{
	int dis[maxn]={0},sum=1;
	bool f[maxn];
	memset(f,0,sizeof(f));memset(dis,0,sizeof(dis));
	f[x]=1;
	for(int i=1;i<=n;i++)
	{
		dis[i]=c[x][i];
	}
	int min=0x7f7f7f7f;
	while(sum<n)
	{
		int j;
		min=0x7f7f7f7f;
		for(int i=1;i<=n;i++)
		{
			if(!f[i] && dis[i]<min)
			{
				min=dis[i];
				j=i;
			}
		}
		sum++;
		f[j]=1;ans+=dis[j];
		for(int i=1;i<=n;i++)
		{
			if(!f[i] && c[j][i]<dis[i])dis[i]=c[j][i];
		}
	}
}