记录编号 221677 评测结果 AAAAA
题目名称 最难的任务 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.086 s
提交时间 2016-01-25 14:30:03 内存使用 0.54 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 205,maxm = 20010; 
struct edge{
	int to,next,w;
}lst[maxm];
int n,m,len,first[maxn];
void insert(int v1,int v2,int cost){
	lst[len].to = v2;
	lst[len].next = first[v1];
	lst[len].w = cost;
	first[v1] = len++;
}
struct node{
	int to,w;
	bool operator < (const node& a)const{
		return w>a.w;
	}
	node(int _to,int _w){
		to = _to;w = _w;
	}
};
bool vis[maxn];
int dis[maxn];
void dij(){
	priority_queue<node> q;
	q.push(node(1,0));
	while(!q.empty()){
		while(!q.empty()&&vis[q.top().to])q.pop();
		if(q.empty())break;
		dis[q.top().to] = q.top().w;
		int j = q.top().to;
		vis[j] = true;
		q.pop();
		for(int pt = first[j];pt;pt = lst[pt].next){
			if(!vis[lst[pt].to])q.push(node(lst[pt].to,dis[j]+lst[pt].w));
		}
	}
}
int main(){
	freopen("hardest.in","r",stdin);
	freopen("hardest.out","w",stdout);
	int t;
	scanf("%d",&t);
	for(;t;--t){
		scanf("%d %d",&n,&m);
		if(n==1){
			printf("0\n");
			continue;
		}
		memset(dis,0,sizeof(dis));
		memset(vis,0,sizeof(vis));
		memset(first,0,sizeof(first));
		len = 1;
		int a,b,c;
		for(int i = 0;i<m;++i){
			scanf("%d %d %d",&a,&b,&c);
			insert(a,b,c);
			insert(b,a,c);
		}
		dij();
		if(dis[n])printf("%d\n",dis[n]);
		else printf("-1\n");
	}
	fclose(stdin);fclose(stdout);	
}