标签:
原题链接:http://poj.org/problem?id=1797
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 24576 | Accepted: 6510 |
Description
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
Source
对于一条路径的限制大小,定义为这条路径上最短的那条边。给你一个无向图,问你从1出发到n的所有路径中,限制大小最大是多少。
定义dp[i]表示从1走到 i 时的限制大小的最大值。然后就像spfa那样,每次从队列里面拿点出来松弛,如果松弛成功,则入队。
#include<iostream> #include<queue> #include<cstring> #include<algorithm> #include<vector> #include<cstdio> #define INF 1000006 #define MAX_N 1003 using namespace std; int d[MAX_N]; int T; struct node { public: int u, c; node(int uu, int cc) : u(uu), c(cc) { } node() { } }; struct edge { public: int to, cost; edge(int t, int c) : to(t), cost(c) { } edge() { } }; queue<node> que; vector<edge> G[MAX_N]; void spfa(int s) { que.push(node(s, INF)); d[s] = INF; while (que.size()) { node now = que.front(); que.pop(); if (now.c != d[now.u])continue; int u = now.u; for (int i = 0; i < G[u].size(); i++) { int v = G[u][i].to; int t = min(d[u], G[u][i].cost); if (t > d[v]) { d[v] = t; que.push(node(v, t)); } } } } int n,m; int main() { scanf("%d", &T); int cas = 0; while (T--) { scanf("%d%d", &n, &m); for (int i = 0; i <= n; i++)G[i].clear(); while (que.size())que.pop(); memset(d, 0, sizeof(d)); for (int i = 0; i < m; i++) { int u, v, c; scanf("%d%d%d", &u, &v, &c); G[u].push_back(edge(v, c)); G[v].push_back(edge(u, c)); } spfa(1); printf("Scenario #%d:\n%d\n\n", ++cas, d[n]); } return 0; }
POJ 1797 Heavy Transportation SPFA变形
标签:
原文地址:http://www.cnblogs.com/HarryGuo2012/p/4746318.html