比赛 20140414 评测结果 AAAAAAAAAA
题目名称 路障 最终得分 100
用户昵称 Dijkstra 运行时间 0.013 s
代码语言 C++ 内存使用 0.80 MiB
提交时间 2014-04-14 09:18:00
显示代码纯文本
#include<fstream>
#define ll long long
#define maxint 0x7fffffff
using namespace std;
ifstream fin("rblock.in");
ofstream fout("rblock.out");
ll map[251][251]={{0}},dis[251]={0},path[251]={0},road[251]={0};//path记录路径前驱,road记录路径
ll N,M,L,s,t;//s记录最短路总长度,t记录差值
ll DIJ1()
{
	int i,j;
	bool use[251]={0};
	for(i=1;i<=N;i++)
	{
		dis[i]=map[1][i];
		path[i]=1;
		use[i]=0;
	}
	dis[1]=0;use[1]=0;path[1]=0;
	for(i=1;i<=N;i++)
	{
		ll min=maxint,u=-1;
		for(j=1;j<=N;j++)
		{
			if(!use[j]&&dis[j]<min)
			{
				min=dis[j];
				u=j;
			}
		}
	    use[u]=1;
		for(j=1;j<=N;j++)
		{
			if(!use[j]&&dis[j]>dis[u]+map[u][j])
			{
				dis[j]=dis[u]+map[u][j];
				path[j]=u;
			}
		}
	}
	ll sum=1,e=N;
	while(e!=1)
	{
		road[sum]=e;
		sum++;
		e=path[e];
	}
	road[sum]=1;
	L=sum;
	return dis[N];
}
ll DIJ2()
{
	int i,j;
	bool use[251]={0};
	for(i=1;i<=N;i++)
	{
		dis[i]=map[1][i];
		use[i]=0;
	}
	dis[1]=0;use[1]=0;
	for(i=1;i<=N;i++)
	{
		ll min=maxint,u=-1;
		for(j=1;j<=N;j++)
		{
			if(!use[j]&&dis[j]<min)
			{
				min=dis[j];
				u=j;
			}
		}
	    use[u]=1;
		for(j=1;j<=N;j++)
		{
			if(!use[j]&&dis[j]>dis[u]+map[u][j]) dis[j]=dis[u]+map[u][j];
		}
	}
	return dis[N];
}
int main()
{
	fin>>N>>M;
	ll i,j,a,b,c;
	for(i=1;i<=N;i++) for(j=1;j<=N;j++) map[i][j]=maxint;
	for(i=1;i<=M;i++)
	{
		fin>>a>>b>>c;
		map[a][b]=map[b][a]=c;
	}
	s=DIJ1();
	for(i=1;i<L;i++)
	{
		map[road[i]][road[i+1]]*=2;
		map[road[i+1]][road[i]]*=2;
		t=max(t,DIJ2()-s);
		map[road[i]][road[i+1]]/=2;
		map[road[i+1]][road[i]]/=2;
	}
	fout<<t<<endl;
    return 0;
}