Dijkstra算法是在图论中应用很广的一种算法,它本质上是贪心的成功应用。它可以求加权图的单源最短路。
但是如果不优化的话,它的复杂度是O(n方),比较低效,一般我们采用邻接表+优先队列的优化。
#include<bits/stdc++.h>
using namespace std;
const int M=1000000000;
struct HeadNode{
int d,u;
bool operator < (const HeadNode& rhs) const{
return d>rhs.d;
}
};
struct edge{
int to;
int cost;
};
vector<edge>G[10005];
bool vis[10005];
int n,m,x,s,t;
int d[10005];
void Dij(){
fill(d+1,d+n+1,M);
d[s]=0;
priority_queue<HeadNode>Q;
Q.push((HeadNode){0,s});
while(!Q.empty()){
HeadNode x=Q.top();Q.pop();
int u=x.u;
if(vis[u])continue;
vis[u]=1;
for(int i=0;i<G[u].size();i++){
edge e=G[u][i];
if(d[e.to]>d[u]+e.cost){
d[e.to]=d[u]+e.cost;
Q.push((HeadNode){d[e.to],e.to});
}
}
}
}
int main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){
edge e;
scanf("%d%d%d",&x,&e.to,&e.cost);
G[x].push_back(e);
}
Dij();
if(d[t]==M)printf("-1");
else printf("%d",d[t]);
return 0;
}