#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int INF=2e9;
const int maxn=1e4+5;
const int MAXN=100+5;
int Distance[MAXN];
bool Visited[MAXN];
int Start,End,edgeN;
int tot=0,curr;
int Head[MAXN];
struct Edge{
int to;
int w;
int Next;
}edge[maxn];
struct Node{
int id,d;
bool operator<(const Node &a)const{
return a.d<d;
}
}node;
priority_queue<Node> que;
void addEdge(int x,int y,int z){
tot++;
edge[tot].to=y;
edge[tot].w=z;
edge[tot].Next=Head[x];
Head[x]=tot;
}
void init(){
memset(Visited,0,sizeof(Visited));
for(int i=0;i<MAXN;i++) Distance[i]=INF;
scanf("%d%d%d",&Start,&End,&edgeN);
for(int i=0,x,y,z;i<edgeN;i++){
scanf("%d%d%d",&x,&y,&z);
addEdge(x,y,z);
}
}
void dijkstra(){
curr=Start; Distance[curr]=0;
node.id=curr; node.d=0; que.push(node);
while(!que.empty()){
curr=que.top().id; que.pop();
if(Visited[curr]) continue;
Visited[curr]=true;
if(Visited[End]) break;
for(int i=Head[curr];i;i=edge[i].Next){
if(!Visited[edge[i].to]&&Distance[edge[i].to]>Distance[curr]+edge[i].w){
Distance[edge[i].to]=Distance[curr]+edge[i].w;
node.id=edge[i].to; node.d=Distance[edge[i].to]; que.push(node);
}
}
}
printf("%d\n",Distance[End]);
}
int main(){
init();
dijkstra();
return 0;
}
Dijkstra
最新推荐文章于 2019-03-13 21:20:58 发布