uva 1416 - Warfare And Logistics(最短路)

来源:互联网 发布:数据库爆破工具 编辑:程序博客网 时间:2024/06/05 06:54

题目链接:uva 1416 - Warfare And Logistics


#include <cstdio>#include <cstring>#include <vector>#include <queue>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 105;const int maxm = 1005;const ll inf = 0x3f3f3f3f3f3f3f3f;struct Edge {int v, w, idx;Edge (int v = 0, int w = 0, int idx = 0):v(v), w(w), idx(idx) {}};struct State {int u;ll dis;State (int u = 0, ll dis = 0): u(u), dis(dis) {}bool operator < (const State& u) const { return dis > u.dis; }};int N, M, L, S[maxn], P[maxn], V[maxn];vector<Edge> G[maxn];ll D[maxn], T[maxm];void init () {memset(T, 0, sizeof(T));int u, v, w, idx;for (int i = 0; i <= N; i++) G[i].clear();for (int i = 1; i <= M; i++) {scanf("%d%d%d", &u, &v, &w);G[u].push_back(Edge(v, w, i));G[v].push_back(Edge(u, w, i));}}ll dijkstra(int s, int e) {for (int i = 1; i <= N; i++)V[i] = P[i] = 0, D[i] = inf;D[s] = 0;priority_queue<State> Q;Q.push(State(s, D[s]));while (!Q.empty()) {int u = Q.top().u;Q.pop();if (V[u]) continue;V[u] = 1;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i].v, w = G[u][i].w, idx = G[u][i].idx;if (idx == e) continue;if (D[v] > D[u] + w) {D[v] = D[u] + w;P[v] = idx;Q.push(State(v, D[v]));}}}ll ret = 0;for (int i = 1; i <= N; i++)ret += (D[i] == inf ? L : D[i]);return ret;}void solve (int s) {ll c = dijkstra(s, 0);memcpy(S, P, sizeof(P));for (int i = 0; i <= M; i++) T[i] += c;for (int i = 1; i <= N; i++) if (S[i])T[S[i]] += dijkstra(s, S[i]) - c;}int main () {while (scanf("%d%d%d", &N, &M, &L) == 3) {init ();for (int i = 1; i <= N; i++)solve(i);ll ans = 0;for (int i = 1; i <= M; i++) ans = max(ans, T[i]);printf("%lld %lld\n", T[0], ans);}return 0;}


0 0
原创粉丝点击