Untitled
elpunknown
c_cpp
3 years ago
2.3 kB
4
Indexable
#include <bits/stdc++.h> #define endl '\n' using namespace std; const int INF = 1000000000; struct WD { int next; int water; int dist; }; struct cmp{ bool operator()(const WD &a, const WD &b){ if(a.dist==b.dist){ return a.water<b.water; } return a.dist> b.dist; } }; int waters[100001]; int dp[100001]; int dp_water[100001]; bool vis[100001]; vector<WD> graph[100001]; int town, road, start, arrive, dis, target; void dijstra(int start, int target){ // 거리의 최소 with 물의 max fill(dp, dp+100001, INF); dp[start] = 0; // dp_water[start] = waters[start]; priority_queue<WD, vector<WD>, cmp> pq; pq.push({start,waters[start],0}); while(!pq.empty()){ WD cur = pq.top(); int cur_idx = cur.next; int cur_dist = cur.dist; int cur_water = cur.water; pq.pop(); for(WD next_node : graph[cur_idx]){ int next_idx = next_node.next; int next_dis = cur_dist + next_node.dist; if(vis[next_idx]) continue; if(next_dis < dp[next_dis]){ cout << cur_idx << endl; //<< " " << next_idx << " " << next_dis << " " << dp[next_idx] << endl; dp[next_idx] = next_dis; if(dp_water[next_idx]<dp_water[cur_idx] + next_node.water){ dp_water[next_idx] = dp_water[cur_idx] + next_node.water; if(!vis[next_idx]){ vis[next_idx] = true; pq.push({next_idx,dp_water[next_idx],next_dis}); } } } } } if(dp[target]!=INF){ cout << dp[target] << " " << dp_water[target] << endl; return; } // if(vis[target]){ // cout << dp[target] << " " << dp_water[target] << endl; // return; // } cout << -1 << endl; return; } int main(void){ cin >> town; for(int i = 1;i<=town;i++){ cin >> waters[i]; } cin >> road; while(road--){ cin >> start >> arrive >> dis; graph[start].push_back({arrive,waters[start],dis}); graph[arrive].push_back({start,waters[arrive], dis}); } cin >> start >> target; dijstra(start,target); }
Editor is loading...