HDU 5137 How Many Maos Does the Guanxi Worth(最短路+列舉)
阿新 • • 發佈:2018-12-13
題解:
首先先跑一遍最短路,用pre陣列記錄最短路路徑,列舉路徑上的所有點(不包括 1 和 n),標記這些點再來跑最短路記錄其中最大的最短路。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <bitset> #include <stack> #include <cmath> #include <deque> #include <queue> #include <list> #include <set> #include <map> #define mem(a, b) memset(a, b, sizeof(a)) #define pi acos(-1) using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; const int maxn = 35; struct node{ int v, c, use; node(){}; node(int v, int c, int use):v(v),c(c), use(use){}; }; struct node1{ int v, c; node1(){}; node1(int v, int c):v(v),c(c){}; }pre[maxn]; vector<node> v[maxn]; int vis[maxn], lowcost[maxn], mark[maxn]; void Dijkstra(int s, int n, int op){ for(int i = 0; i <= n; i++){ lowcost[i] = inf; vis[i] = 0; if(op == 0){ pre[i] = node1(-1, inf); } } lowcost[s] = 0; for(int i = 0; i < n; i++){ int k = -1; int minn = inf; for(int j = 1; j <= n; j++){ if(!vis[j] && lowcost[j] < minn){ minn = lowcost[j]; k = j; } } if(k == -1){ break; } vis[k] = 1; for(int j = 0; j < v[k].size(); j++){ if(mark[v[k][j].v] && !vis[v[k][j].v] && lowcost[k] + v[k][j].c < lowcost[v[k][j].v]){ lowcost[v[k][j].v] = lowcost[k] + v[k][j].c; if(op == 0){ pre[v[k][j].v] = node1(k, v[k][j].c); } } } } } int main(){ int n, m; while(scanf("%d %d", &n, &m), n&&m){ for(int i = 1; i <= n; i++){ v[i].clear(); mark[i] = 1; } for(int i = 0; i < m; i++){ int x, y, c; scanf("%d %d %d", &x, &y, &c); v[x].push_back(node(y, c, 0)); v[y].push_back(node(x, c, 0)); } Dijkstra(1, n, 0); int ans = lowcost[n]; int s = n; while(pre[s].v != 1){ mark[pre[s].v] = 0; Dijkstra(1, n, 1); ans = max(ans, lowcost[n]); mark[pre[s].v] = 1; s = pre[s].v; } if(ans == inf){ printf("Inf\n"); } else{ printf("%d\n", ans); } } }