#include<iostream>
#include<vector>
#include<queue>
#define LL long long
#define INF 99999999
#define maxn 1005
using namespace std;
int n,m,startv,endv;//点、边、起点,终点
struct Node
{
int pos,c;
friend bool operator <(Node a,Node b)//运算符重载
{
return a.c>b.c;
}
};
vector<Node>g[maxn];//邻接表
int dis[maxn];//距离数组
void init()//初始化
{
for(int i=1;i<=n;i++)
g[i].clear();
}
void dij(int from)//输入起点
{
priority_queue<Node>q;//优先队列
for(int i=0;i<=n;i++)
dis[i]=INF;
dis[from]=0;
Node now={from,0};
q.push(now);
while(!q.empty())
{
now=q.top();
q.pop();
int v=now.pos;
if(dis[v]<now.c)//如果到同一点的距离有多组,取最小的
continue;
for(int i=0;i<g[v].size();i++)
{
Node e;
e=g[v][i];
if(dis[e.pos]>dis[v]+e.c)
{
dis[e.pos]=dis[v]+e.c;
Node next={e.pos,dis[e.pos]};
q.push(next);
}
}
}
}
int main()
{
cin>>n>>m;
init();
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
Node p;
p.pos=b;
p.c=c;
g[a].push_back(p);
p.pos=a;
g[b].push_back(p);
}
cin>>startv>>endv;
dij(startv);
cout << dis[endv] << endl;
}
最短路的优先队列的优化
最新推荐文章于 2024-08-01 10:12:30 发布