#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
const int N=10000;
int head[N],dis[N],to[N<<1],w[N<<1],nxt[N<<1];
int cnt;
int m,n;
void add(int u,int v,int z)
{
to[++cnt]=v;
nxt[cnt]=head[u];
w[cnt]=z;
head[u]=cnt;
}
int vis[N];
struct node
{
int index,dist;
bool operator <(const node &x)const
{
return dist>x.dist;
}
};
void diji(int s)
{
priority_queue<node>q;
for(int i=1;i<=n;i++)
dis[i]=0x3f3f3f3f,vis[i]=0;
dis[s]=0;
q.push(node{s,0});
while(!q.empty())
{
node x=q.top();
q.pop();
int u=x.index;
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=nxt[i])
{
if(dis[to[i] ]>dis[u]+w[i])
{
dis[to[i] ]=dis[u]+w[i];
q.push(node{to[i],dis[to[i] ]});
}
}
}
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
diji(1);
printf("%d",dis[n]);
}
堆优化迪杰斯特拉
最新推荐文章于 2024-03-26 10:27:41 发布