题目就是找出从1到n的一条路径,使得这条路径的最小边权最大。
dijkstra算法的变形,状态为终点V和到该点的最小边权的最大值M。
#pragma warning(disable:4996) #include <cstdio> #include <cstring> #include <queue> #include <vector> #include <algorithm> using namespace std; const int N = 1005; const int M = N*N; const int inf = 0x6fffffff; vector<int>g[N], e[N]; bool vis[N]; int ans[N]; int n, m; struct node { int v, M;//从源点到点v能通过的重量的最大值 node() {} node(int v, int M) :v(v), M(M) {} bool operator<(const node&op)const { return M < op.M; } }; void add(int u, int v, int c) { g[u].push_back(v); e[u].push_back(c); } void dijkstra() { memset(vis, false, sizeof vis); memset(ans, 0, sizeof ans); priority_queue<node>q; q.push(node(1, inf)); ans[1] = inf; while (!q.empty()) { node now = q.top(); q.pop(); int u = now.v; if (vis[u])continue; vis[u] = true; if (u == n)break; for (int i = 0; i < (int)g[u].size(); i++) { int v = g[u][i], c = e[u][i]; if (vis[v])continue; int tmp = min(ans[u], c); if (ans[v] < tmp) { ans[v] = tmp; q.push(node(v, ans[v])); } } } } int main() { int t; scanf("%d", &t); for (int kase = 1; kase <= t; kase++) { for (int i = 1; i < N; i++) { g[i].clear(); e[i].clear(); } scanf("%d %d", &n, &m); for (int i = 1; i <= m; i++) { int u, v, c; scanf("%d %d %d", &u, &v, &c); add(u, v, c); add(v, u, c); } dijkstra(); printf("Scenario #%d:\n", kase); printf("%d\n\n", ans[n]); } return 0; }