记录编号 133229 评测结果 EEEEE
题目名称 公路建设 最终得分 0
用户昵称 Gravatar笑一炮 是否通过 未通过
代码语言 C++ 运行时间 0.584 s
提交时间 2014-10-27 16:49:09 内存使用 2.30 MiB
显示代码纯文本
#include <iostream>
#include <string.h>
#include <iomanip>
#include <fstream>
using namespace std;
ifstream fin("road.in");
ofstream fout("road.out");

const int maxn=510,INF=1<<30;
int n,m,siz[maxn],fa[maxn],temp,from,to;
double sum=0,d[maxn][maxn],dis;

int min(int a,int b) {	return a<b? a:b;	}

int findfa(int x)
{
	if (fa[x]==x)	return x;
	else 
	{
		temp=fa[x];
		fa[x]=findfa(fa[x]);
		siz[temp]-=siz[x];
		if (temp==fa[x]) siz[fa[x]]+=siz[x];
	}
	
}
void merge(int a,int b)
{
	a=findfa(a),b=findfa(b);
	if (a!=b)
	{
		fa[a]=b;
		siz[b]+=siz[a];
	}
}
void prim(int s)
{
	bool done[maxn];
	int ss=1,min;
	double p[maxn];
	memset(done,0,sizeof(done));
	done[s]=true;
	p[0]=INF;
	for (int i=1;i<=n;i++)
		if (!done[i] && d[s][i]!=INF)	p[i]=d[s][i];
		else p[i]=INF;
	sum=0;
	while (ss!=n)
	{
		min=0;
		for (int i=1;i<=n;i++)
			if (!done[i] && p[i]<p[min]) min=i; 
		if (min==0) break;
		ss++;
		sum+=p[min];
		done[min]=true;
		for (int i=1;i<=n;i++)
			if (!done[i] && p[i]>d[min][i])
						p[i]=d[min][i];
	}
}
int main()
{
	fin>>n>>m;
	for (int i=1;i<=n;i++)
	{
		fa[i]=i;
		siz[i]=1;
	}
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
			d[i][j]=INF;
	bool k=false;
	fout<<setiosflags(ios::fixed)<<setprecision(1);
	for (int a=1;a<=m;a++)
	{
		fin>>from>>to>>dis;
		d[from][to]=d[to][from]=min(d[from][to],dis);
		merge(from,to);
		if (!k)
		{
			if (siz[findfa(1)]==n)
			{
				k=true;
				prim(1);	
				fout<<sum/2<<endl;
				continue;
			}
			fout<<'0'<<endl;
		} 
		else
		{
			prim(1);
			fout<<(sum/2)<<endl;
		}
	}
	return 0;

}