Heavy Transportation |
---|
题意: 在一个无向图中,求一条1号点到N号点的路径,要求使得路径中的边权最小值最大。
题解: 只针对单条边的边权,只要在Dijkstra的基础上,将按距离从小到大排序改成按单条边权从大到小排序,求到达n点路上的最小值即可。
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define _for(i, a, b) for(int i = (a); i <= (b); ++i)
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 1e3 + 10;
int _T, tot, n, m;
int vis[N];
struct node {
int id, w;
node(){}
node(int id, int w): id(id), w(w) {}
bool operator<(const node &A)const{
return A.w > w;}
};
struct edge {
int v, w;
edge() {}
edge(int v, int w): v(v), w(w) {}
};
vector<edge> e[N];
void dijkstra() {
_for(i, 1, n) vis[i] = 0;
int ans = inf;
priority_queue<node> Q;
Q.push(node(1, inf));
while(!Q.empty()) {
node u = Q.top(); Q.pop();
if(vis[u.id]) continue;
vis[u.id] = 1;
ans = min(ans, u.w);
if(u.id == n) {
printf("%d\n\n", ans);
return;
}
_for(i, 0, e[u.id].size() - 1) {
int v = e[u.id][i].v;
int w = e[u.id][i].w;
if(vis[v]) continue;
Q.push(node(v, w));
}
}
}
void run() {
printf("Scenario #%d:\n", ++tot);
scanf("%d%d", &n, &m);
_for(i, 1, n) e[i].clear();
while(m--) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
e[u].push_back(edge(v, w));
e[v].push_back(edge(u, w));
}
dijkstra();
}
int main() {
scanf("%d", &_T);
while(_T--) run();
return 0;
}