记录编号 96610 评测结果 AAAAAAAAAA
题目名称 [USACO Feb14]路障 最终得分 100
用户昵称 Gravatar(ˇˍˇ) ~耶稣 是否通过 通过
代码语言 C++ 运行时间 1.351 s
提交时间 2014-04-14 11:50:53 内存使用 1.63 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

 const int u=60000;
 int ver[u],dis[u],next[u],head[30000],tot;
 int n,m,ans,d[u],q[u],minroad;
 bool v[u];
 
 void add(int x,int y,int z){
 	ver[++tot]=y;
 	dis[tot]=z;
 	next[tot]=head[x];
 	head[x]=tot;
 }
 
 void spfa(int s){
 	memset(v,0,sizeof(v));
 	memset(d,127,sizeof(d));
 	int l=1,r=1;
	q[1]=s; d[s]=0;
	v[s]=1;
	while (l<=r){
		for (int j=head[q[l]]; j; j=next[j]){
			int y=ver[j],x=q[l];
			if (d[y]>d[x]+dis[j]){
				d[y]=d[x]+dis[j];
				if (!v[y]){
					v[y]=1;
					q[++r]=y;
				}
			}
		}
		v[q[l]]=0;
		l++;
	}
	return;
 }
 
 void baoli(){
 	ans=0;
 	for (int i=2; i<tot; i=i+2){
 		dis[i]*=2;
 		dis[i^1]*=2;
 		spfa(1);
 		dis[i]/=2;
 		dis[i^1]/=2;
 		if (d[n]-minroad>ans)
 		 ans=d[n]-minroad;
 	}
 	return;
 }
 
int main(){
	freopen("rblock.in","r",stdin);
	freopen("rblock.out","w",stdout);
	scanf("%d%d",&n,&m);
	tot=1;
	memset(head,0,sizeof(head));
	memset(next,0,sizeof(next));
	for (int i=1; i<=m; i++){
		int x,y,z;
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z);
		add(y,x,z);
	}
	spfa(1);
	minroad=d[n];
	baoli();
	//find();
	printf("%d",ans);
	return 0;
}