PAT--1003. Emergency (最短路)
2016-09-29 23:08
190 查看
1003. Emergency
题解
最短路,要维护两个数据,最短路的条数以及救援队的最大个数。#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; const int maxn = 500 + 3; const int inf = 0x3f3f3f3f; struct Edge{ int to, w; }; struct Node{ int u, d; bool operator < (const Node& rhs) const{ return d > rhs.d; } }; vector<Edge> G[maxn]; int n, m, s, t; int a[maxn]; int pathNum[maxn]; int dist[maxn]; bool vis[maxn]; int teams[maxn]; void Dijkstra(int s){ for(int i = 0; i < n; ++i) dist[i] = inf; priority_queue<Node> Q; Q.push(Node{s, 0}); dist[s] = 0; pathNum[s] = 1; teams[s] = a[s]; while(!Q.empty()){ Node p = Q.top(); Q.pop(); int u = p.u; if(vis[u]) continue; vis[u] = true; for(int i = 0; i < G[u].size(); ++i){ int v = G[u][i].to, d = G[u][i].w; if(!vis[v]){ if(dist[v] > dist[u] + d){ pathNum[v] = pathNum[u]; dist[v] = dist[u] + d; teams[v] = teams[u] + a[v]; Q.push(Node{v, dist[v]}); } else if(dist[v] == dist[u] + d){ teams[v] = max(teams[v], teams[u] + a[v]); pathNum[v] += pathNum[u]; } } } } cout << pathNum[t] << " " << teams[t] << endl; } // brute force searching every path !!! int cnt, maxteams, mindist = inf; void dfs(int u, int d, int teams){ if(u == t){ if(d < mindist) mindist = d, cnt = 1, maxteams = teams; else if(d == mindist) cnt++, maxteams = max(maxteams, teams); return; } vis[u] = true; for(int i = 0; i < G[u].size(); ++i){ int v = G[u][i].to, w = G[u][i].w; if(!vis[v]) dfs(v, d + w, teams + a[v]); } vis[u] = false; } int main(){ #ifdef EXMY freopen("data.in", "r", stdin); #endif cin >> n >> m >> s >> t; for(int i = 0; i < n; ++i) cin >> a[i]; while(m--){ int u, v, w; cin >> u >> v >> w; G[u].push_back(Edge{v, w}); G[v].push_back(Edge{u, w}); } Dijkstra(s); // dfs(s, 0, a[s]); // cout << cnt << " " << maxteams << endl; return 0; }
相关文章推荐
- PAT(Advanced Level) 1003. Emergency(25) 最短路 + DFS
- PAT 1003. Emergency (25) (求两点间最短路的条数)
- pat 甲1003. Emergency(最短路)
- PAT 1003. Emergency 单源最短路
- PAT 1003. Emergency Dijkstra变形+求相等最短路的数量+特殊权重
- PAT甲级-1003. Emergency (25)多条最短路
- 【PAT】1003. Emergency (25)【单源最短路问题/dijkstra算法】
- PAT—1003. Emergency
- PAT Advanced Level 1003. Emergency (25)(Java and C++)
- PAT 1087. All Roads Lead to Rome (30) Dijkstra题——多条件最短,最短路数量,途径点
- 浙大PAT (Advanced Level) Practise 1003. Emergency (25)
- PAT 甲级 1003. Emergency 使用 优先队列 dijkstra 算法
- 【PAT甲级】1003. Emergency (25)
- PAT (Advanced) 1003. Emergency (25)
- PAT(甲)1003. Emergency(25)
- PAT 1003. Emergency
- PAT 甲级 1003Emergency(Dijkstra最短路)
- PAT 1003. Emergency (25)
- PAT 1003 Emergency(最短路(迪杰斯特拉||贝尔曼)最小边权下的最大点权)
- PAT甲级1003. Emergency (25)