题目描述
mzc家很有钱(开玩笑),他家有n个男家丁(做过前三弹的都知道)。但如此之多的男家丁吸引来了我们的体委(矮胖小伙),他要来与mzc争夺男家丁。
mzc很生气,决定与其决斗,但cat的体力确实有些不稳定,所以他需要你来帮他计算一下最短需要的时间。
输入输出格式
输入格式:
第一行有两个数n,m.n表示有n个停留站,m表示共有m条路。
之后m行,每行三个数a_i ; b_i ; c_i 表示第a_i个停留站到第b_i个停留站需要c_i的时间。(无向)
输出格式:
一行,输出1到n最短时间。
输入输出样例
输入样例#1:
5 8
1 2 3
2 3 4
3 4 5
4 5 6
1 3 4
2 4 7
2 5 8
1 5 100
输出样例#1:
11
说明
n≤2500 m≤2∗10^5
由于mzc大大十分着急,所以他只能等待1s。
【AC代码】:
#include<bits/stdc++.h>
#define M(a,b) memset(a,b,sizeof(a))
#define pi 3.1415926
using namespace std;
int cnt,n,m,i;
int head[100005],dis[100005];
bool vis[100005]={0};
struct node{
int dis,jd;
bool operator < (const node &a) const{
return a.dis<dis;
}
};
struct Edge{
int next,to,worth;
}e[100005*1000];
void insert(int from,int to,int worth){
e[++cnt].next=head[from];
e[cnt].to=to;
e[cnt].worth=worth;
head[from]=cnt;
}
void dijkstra(){
priority_queue<node>q;
for(int i=1;i<=n;i++)
dis[i]=0x3f3f3f3f;
dis[1]=0;
q.push((node){0,1});
while(!q.empty()){
node now=q.top();
q.pop();
if(vis[now.jd]) continue;
vis[now.jd]=true;
for(int i=head[now.jd];i;i=e[i].next)
if(dis[e[i].to]>dis[now.jd]+e[i].worth)
{
dis[e[i].to]=dis[now.jd]+e[i].worth;
q.push((node){dis[e[i].to],e[i].to});
}
}
}
int main(){
cin>>n>>m;
for(i=1;i<=m;i++){
int x,y,z;
cin>>x>>y>>z;
insert(x,y,z);
insert(y,x,z);
}
dijkstra();
cout<<dis[n];
return 0;
}