//单源最短路(Dijkstra)
#include<iostream>
using namespace std;
const int maxn=10010;
int cost[maxn][maxn];
int d[10010];
bool used[maxn];
int V;
const int INF=1e7;
void dijkastra(int s){
fill(d,d+V,INF);
fill(used,used+V,false);
int d[s]=0;
while (true) {
int v=-1;
for(int i=0;i<V;i++){
if(!used[i]&&(v==-1|d[i]<d[v])) v=i;
}
if(v==-1) break;
used[v]=true;
for(int u=0;u<V;u++){
d[u]=min(d[u],d[v]+cost[v][u]);
}
}
}
//单源最短路(Dijkstra)
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
struct edge{
int to,cost;
};
typedef pair <int,int> P; //first--min-distence secent--id;
int V;
vector<edge> G[10010];
const int INF=1e7;
int d[10010];
void dijkastra(int s){
priority_queue<P,vector<P>,greater<P>> que;
fill(d,d+V,INF);
d[s]=0;
que.push(P(0,s));
while(!que.empty()){
P p=que.top();
que.pop();
int v=p.second;
if(d[v]<p.first) continue;
for(int i=0;i<G[v].size();i++){
edge e=G[v][i];
if(d[e.to]>d[v]+e.cost)
{
d[e.to]=d[v]+e.cost;
que.push(P(d[e.to],e.to));
}
}
}
}