#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template class EdgeBase { public: int to; T cost; EdgeBase(){}; EdgeBase(int to0, T cost0){to = to0; cost = cost0;} }; typedef EdgeBase Edge; template void shortestPath(const vector > >& edges, int start, vector& dist) { const T INF = numeric_limits::max(); const T EPS = static_cast(1.0e-10); dist.assign(edges.size(), INF); dist[start] = 0; priority_queue, vector >, greater > > q; q.push(make_pair(0, start)); while(!q.empty()){ pair p = q.top(); q.pop(); int v = p.second; if(dist[v] < p.first - EPS) continue; for(unsigned i=0; i e = edges[v][i]; if(dist[v] + e.cost < dist[e.to] - EPS){ dist[e.to] = dist[v] + e.cost; q.push(make_pair(dist[e.to], e.to)); } } } } int main() { int n, m, s, g; cin >> n >> m >> s >> g; vector > edges(n); for(int i=0; i> a >> b >> c; edges[a].push_back(Edge(b, c)); edges[b].push_back(Edge(a, c)); } vector dist; shortestPath(edges, s, dist); queue q; vector to(n, INT_MAX); q.push(g); to[g] = -1; while(!q.empty()){ int x = q.front(); q.pop(); for(unsigned i=0; i