比赛 |
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;
}