#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#define MAXN 100001
using namespace std;
struct data
{
int len,to,next;
}edge[2*MAXN];
int tot,head[MAXN];
void insert(int x,int y,int z)
{
edge[++tot].to=y;
edge[tot].len=z;
edge[tot].next=head[x];
head[x]=tot;
edge[++tot].to=x;
edge[tot].len=z;
edge[tot].next=head[y];
head[y]=tot;
}
int dis[MAXN],vis[MAXN];
typedef pair<int,int> pa;
priority_queue <pa> heap;//pq默认大根堆,可传负数当小根堆使用
void Dijkstra()
{
memset(dis,0x3f,sizeof(dis));
dis[1]=0;heap.push(pa(0,1));
while(!heap.empty())
{
int x=-heap.top().first;
int y=heap.top().second;
heap.pop();
if(vis[y]) continue;
vis[y]=1;
for(int i=head[y]; i; i=edge[i].next)
{
if(vis[edge[i].to]) continue;
if(dis[edge[i].to]>x+edge[i].len)
{
dis[edge[i].to]=x+edge[i].len;
heap.push(pa(-dis[edge[i].to],edge[i].to));
}
}
}
}
int v,e,x,y,z;
int main()
{
scanf("%d%d",&v,&e);//v点数,e边数
for(int i=1; i<=e; i++)
{
scanf("%d%d%d",&x,&y,&z);
insert(x,y,z);
}
Dijkstra();
printf("%d\n",dis[v]);
return 0;
}
[ 模板 ] 堆优化Dijkstra
最新推荐文章于 2020-10-17 21:42:46 发布