| 比赛 | 2008haoi模拟训练2 | 评测结果 | AAAAA | 
    | 题目名称 | 公路建设 | 最终得分 | 50 | 
    | 用户昵称 | BYVoid | 运行时间 | 0.000 s | 
    | 代码语言 | C++ | 内存使用 | 0.00 MiB | 
    | 提交时间 | 2008-04-23 18:12:12 | 
显示代码纯文本
#include <iostream>
#include <iomanip>
#include <fstream>
#define MAXM 2001
#define MAXN 501
using namespace std;
typedef struct
{
	long a,b,v;
}edge;
ifstream fi("road.in");
ofstream fo("road.out");
long adjl[MAXN][MAXN],dis[MAXN][MAXN],INF,N,M,Ncnt;
bool vis[MAXN];
edge MAXE;
long getmaxe(long i,long S)
{
	vis[i]=true;
	long j,k;
	for (k=1;k<=adjl[i][0];k++)
	{
		j=adjl[i][k];
		if (j==INF) continue;
		if (dis[i][j]==INF || vis[j]) continue;
		if (j==S)
		{
			MAXE.a=i;MAXE.b=j;MAXE.v=dis[i][j];
			return dis[i][j];
		}
		long b=getmaxe(j,S);
		if (b>=0)
		{
			if (dis[i][j]>MAXE.v)
			{
				MAXE.a=i;MAXE.b=j;MAXE.v=dis[i][j];
			}
			return b+dis[i][j];
		}
	}
	return -1;
}
long getvalue(int i)
{
	vis[i]=true;
	Ncnt++;
	int j,k;
	long P=0;
	for (k=1;k<=adjl[i][0];k++)
	{
		j=adjl[i][k];
		if (j==INF) continue;
		if (dis[i][j]==INF || vis[j]) continue;
		P+=dis[i][j];
		P+=getvalue(j);
	}
	return P;
}
void delmaxe()
{
	long i,j;
	dis[MAXE.a][MAXE.b]=dis[MAXE.b][MAXE.a]=INF;
	for (i=1;i<=adjl[MAXE.a][0];i++)
	{
		if (adjl[MAXE.a][i]==MAXE.b)
		{
			adjl[MAXE.a][i]=INF;
			break;
		}
	}
	for (i=1;i<=adjl[MAXE.b][0];i++)
	{
		if (adjl[MAXE.b][i]==MAXE.a)
		{
			adjl[MAXE.b][i]=INF;
			break;
		}
	}
}
void request()
{
	memset(dis,0xf,sizeof(dis));
	INF=dis[0][0];
	long i,a,b,v;
	fi >> N >> M;
	for (i=1;i<=M;i++)
	{
		fi >> a >> b >> v;
		memset(vis,0,sizeof(vis));
		long B=getmaxe(a,b);
		if (B>=0) //A,B连通,删除最大边
		{
			if (v<MAXE.v)
			{
				delmaxe();
				dis[a][b]=dis[b][a]=v;
				adjl[a][ ++adjl[a][0] ]=b;
				adjl[b][ ++adjl[b][0] ]=a;
			}
		}
		else
		{
			dis[a][b]=dis[b][a]=v;
			adjl[a][ ++adjl[a][0] ]=b;
			adjl[b][ ++adjl[b][0] ]=a;
		}
		Ncnt=0;
		memset(vis,0,sizeof(vis));
		B=getvalue(a);
		if (Ncnt<N)
			fo << 0 << endl;
		else
			fo << fixed << setprecision(1) << B/2.0 << endl;
	}
}
void print()
{
	fi.close();
	fo.close();
}
int main()
{
	request();
	print();
	return 0;
}