// Dijkstra法(枝刈りあり)(無向木経路探索) // 「終点」から全点間の最短距離を求める // 最短経路を辞書順最小で表示 // 計算量O((E+V)logE) #include #define rep(i,n) for(int i=0;i route; void Dijkstra(){ // 距離をINFで初期化 rep(to,VMAX) dist[to]=INF; // 始点は0 dist[goal]=0; // フラグを下げる rep(v,VMAX) used[v]=false; // 優先度付きキュー:[距離,頂点]←距離の昇順 priority_queue,vector>,greater>> q; // 距離0,始点 q.push(make_pair(0,goal)); // dijkstra while(q.size()){ // 取り出してd=距離,v=頂点 pair p=q.top(); q.pop(); int d=p.first,v=p.second; if(used[v]) continue; used[v]=true; // 頂点から出る辺すべてについて for(int to=0;to0 && d+board[v][to]>V>>E>>start>>goal; rep(i,E){ int from,to,distance; cin>>from>>to>>distance; board[from][to]=board[to][from]=distance; } Dijkstra(); Route(start); for(auto i:route) cout<