把第一个推倒 求所有多米诺倒下的最短时间 不是每个点上有一个骨牌 是路上都有 每个点只是关键的骨牌
只有一种最优解 先求出1到各点的最短路 求最短路中的最大值 这是一个关键点的情况
在枚举每一条边 u v w 如果(d[u] + d[v] + w) / 2 > max 就更新一下 因为是要求最短路的最大值 这是2个关键点的情况
Dijkstra
#include <cstring> #include <cstdio> #include <vector> #include <queue> using namespace std; const int maxn = 510; const double INF = 999999999; struct HeapNode { double d; int u; bool operator < (const HeapNode& rhs) const { return d > rhs.d; } }; struct Edge { int from, to; double dist; }; vector <Edge> edges; vector <int> G[maxn]; bool done[maxn]; double d[maxn]; int n, m, t; void AddEdge(int from, int to, double dist) { edges.push_back((Edge){from, to, dist}); edges.push_back((Edge){to, from, dist}); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } void Dijkstra() { priority_queue <HeapNode> Q; for(int i = 1; i <= n; i++) d[i] = INF; d[1] = 0; memset(done, 0, sizeof(done)); Q.push((HeapNode){0, 1}); while(!Q.empty()) { HeapNode x = Q.top();Q.pop(); int u = x.u; if(done[u]) continue; done[u] = true; //printf("%d\n", u); for(int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; if(d[e.to] > d[u] + e.dist) { d[e.to] = d[u] + e.dist; Q.push((HeapNode){d[e.to], e.to}); } } } } int main() { int cas = 1; while(scanf("%d %d", &n, &t) && (n+t)) { edges.clear(); for(int i = 1;i <= n; i++) G[i].clear(); for(int i = 1; i <= t; i++) { int u, v; double w; scanf("%d %d %lf", &u, &v, &w); AddEdge(u, v, w); } Dijkstra(); double ans = d[1]; int p1 = 1, p2 = 0; int flag = 1; for(int i = 1; i <= n; i++) { if(ans < d[i]) { ans = d[i]; p1 = i; } } for(int i = 1; i <= n; i++) { for(int j = 0; j < G[i].size(); j++) { Edge e = edges[G[i][j]]; double s = (d[i] + d[e.to] + e.dist) / 2; if(s > ans) { flag = 0; ans = s; if(i < e.to) { p1 = i; p2 = e.to; } else { p2 = i; p1 = e.to; } } } } if(flag) { printf("System #%d\nThe last domino falls after %.1f seconds, at key domino %d.\n\n", cas++, ans, p1); } else { printf("System #%d\nThe last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n", cas++, ans, p1, p2); } } return 0; }
TOJ 1883 ZOJ 1298 POJ 1135 Domino Effect / Dijkstra,布布扣,bubuko.com
TOJ 1883 ZOJ 1298 POJ 1135 Domino Effect / Dijkstra
原文:http://blog.csdn.net/u011686226/article/details/19973387