图论模板
#include<bits/stdc++.h>
using namespace std;
const int maxv=1001;
const double dINF=1e20;
struct Edge{
int begin, end;
double len;
Edge(int begin, int end, double len):begin(begin), end(end), len(len){}
};
struct Map_list{
int g_size, v_size, pre[maxv];
vector<Edge> edges;
vector<int> G[maxv];
Map_list(){v_size=g_size=0;}
void AddEdge(int begin, int end, double len){
edges.push_back(Edge(begin, end, len));
G[begin].push_back(edges.size()-1);
g_size++;
}
void Make(int n, int m){
v_size=n;
for(int i=0; i<m; i++){
int begin, end;
double len;
cin >> begin >> end >> len;
AddEdge(begin, end, len);
}
}
void show(){
for(int i=1; i<=v_size; i++)
for(int j=0; j<G[i].size(); j++){
Edge & e=edges[G[i][j]];
cout << e.begin << " " << e.end << " "<< e.len << endl;
}
}
void showway
double dijkstra(int from, int to, bool show=0){
int djused[maxv];
double djdis[maxv];
memset(pre, 0, sizeof(pre));
memset(djused, 0, sizeof(djused));
for(int i=1; i<=v_size; i++)
djdis[i]=dINF;
djdis[from]=0;
for(int i=0; i<G[from].size(); i++)
djdis[edges[G[from][i]].end]=edges[G[from][i]].len;
for(int i=1; i<=v_size; i++){
int si;
double ma=dINF;
for(int j=0; j<G[from].size(); j++)
if(djdis[edges[G[from][j]].end]<ma) {si=edges[G[from][j]].end; ma=djdis[si];}
for(int j=0; j<G[si].size(); j++){
if(djdis[si]+edges[G[si][j]].len<djdis[edges[G[si][j]].end]){
djdis[edges[G[si][j]].end]=djdis[si]+edges[G[si][j]].len;
pre[edges[G[si][j]].end]=si;
}
}
}
if(show==true){
cout << from << " ";
showway(from, to);
cout << to << endl;
}
return djdis[to];
}
}map1;
int main(void){
int n, m;
cin >> n >> m;
map1.Make(n, m);
cout << map1.dijkstra(1, 2) << endl;
}