# dijkstra algorithm
## 模板
```cpp=
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define inf 2e18
#define maxn 100005
#define mod 1000000007
vector<pair<int,int>>graph[maxn];
int dis[maxn];
bool visited[maxn]={false};
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
}
```
## 範例練習
zerojudge:PD.紅血球的快遞任務
https://zerojudge.tw/ShowProblem?problemid=g422
```cpp=
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define inf 1e9
#define maxn 100005
int dis[maxn];
bool gone[maxn]={false};
vector<pair<int,int>>vec[maxn];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
int n,m,b;
int x,y,w;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>b;
//initialize
for(int i=0;i<n;i++){
dis[i]=inf;
}
dis[0]=0;
//建圖
for(int i=0;i<m;i++){
cin>>x>>y>>w;
vec[x].push_back({y,w});
vec[y].push_back({x,w});
}
//dijkstra
pq.push({0,0});
while(!pq.empty()){
auto now=pq.top();
pq.pop();
int v=now.second;
if(gone[v]){
continue; //走過就跳過
}
gone[v]=true; //標記成已經走訪過
for(auto next:vec[v]){ //找跟這點相鄰的
int u=next.first;
int k=next.second;
if(dis[u]>dis[v]+k){
dis[u]=dis[v]+k;
pq.push({dis[u],u});
}
}
}
cout<<dis[b];
}
//g422
```