描述
给定 M 条边, N 个点的带权无向图。求 1到 N 的最短路。
输入
第一行:N,M(N≤100000,M≤500000);接下来M行3个正整数:ai,bi,ci表示ai,bi之间有一条长度为ci的路,ci≤1000。
输出
一个整数,表示 1 到 N 的最短距离。
#include <bits/stdc++.h>
#define rush() int T;cin>>T;while(T--)
#define sf(a) scanf("%d\n",&a)
#define go(a) while(scanf("%d",&a)!=EOF)
#define ms(a,b) memset(a,b,sizeof a)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pf(a) printf("%.8lf",a)
#define E 1e-8
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int idata=3e6+5e5;
struct Node
{
int next;
int to, dis;
}node[idata];
int i,j,k;
int n,m,t,cnt;
int head[idata],dis[idata];
bool vis[idata];
queue<int>q;
void edge(int from,int to,int dis)
{
node[++cnt].next=head[from];
node[cnt].to=to;
node[cnt].dis=dis;
head[from]=cnt;
}
int main()
{
cin.tie(0);
iostream::sync_with_stdio(false);
while(cin>>n>>m)
{
for(i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
edge(x,y,z);
edge(y,x,z);
}
ms(dis,0x7f),ms(vis,0);
vis[1]=true,dis[1]=0;
q.push(1);
while(!q.empty())
{
int s=q.front();
q.pop();
vis[s]=false;
for(i=head[s];i;i=node[i].next)
{
int k=node[i].to;
int distance=node[i].dis;
if(dis[k]>dis[s]+distance)
{
dis[k]=dis[s]+distance;
if(!vis[k])
{
vis[k]=true;
q.push(k);
}
}
}
}
cout<<dis[n]<<endl;
}
return 0;
}