记录编号 270887 评测结果 AAAAAAAAAA
题目名称 [Tyvj Feb11] GF打dota 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 0.087 s
提交时间 2016-06-15 13:54:04 内存使用 14.05 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define maxn 10010
#define maxe 1000010
using namespace std;
int n,m,q;
struct Edge{
	int to,next,w;
}e[maxe];
struct Node{
	int num,dist;
	int h,g;
	Node(int x,int y){
		num=x;dist=y;
	}
	Node(int x,int y,int z){
		num=x;g=y;h=z;
		dist=h+g;
	}
	bool operator <(const Node&A) const{
		return dist>A.dist;
	}
};
int tot,head[maxe];
int dis[maxn];
void Laddedge(int from,int to,int w)
{
	e[++tot].to=to;
	e[tot].w=w;
	e[tot].next=head[from];
	head[from]=tot;
}
void Ldijkstra(int begin)
{
	memset(dis,0x7f,sizeof(dis));
	priority_queue<Node> q;
	dis[begin]=0;
	q.push(Node(begin,0));
	while(!q.empty()){
		Node node=q.top();q.pop();
		int k=node.num;
		if(dis[k]!=node.dist) continue;
		for(int i=head[k];i;i=e[i].next){
			int to=e[i].to;
			if(dis[to]>dis[k]+e[i].w){
				dis[to]=dis[k]+e[i].w;
				q.push(Node(to,dis[to]));
			}
		}
	}
}
void Lastar(int s,int t,int k)
{
 
	priority_queue<Node> q;
	q.push(Node(s,0,dis[s]));
	while(!q.empty()){
		Node x=q.top();q.pop();
		int id=x.num;
	//	cout<<id<<endl;system("pause");
		if(id==t){
		//	cout<<x.g<<endl;system("pause");
			if(k==2){k--;continue;}	
			if(k==1&&x.g!=dis[1]){
				printf("%d",x.g);
				return;
			}
		}
		for(int i=head[id];i;i=e[i].next){
			int to=e[i].to;
			q.push(Node(to,x.g+e[i].w,dis[to]));
		}
	}
}
int main()
{
	freopen("dota.in","r",stdin);
	freopen("dota.out","w",stdout);
	scanf("%d%d",&n,&m);
	int x,y,w;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&w);
		Laddedge(x,y,w);
		Laddedge(y,x,w);
	}
	Ldijkstra(n);
	scanf("%d",&q);
	if(q==0) printf("%d",dis[1]);
	else Lastar(1,n,2);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}