题意:给你一个n个点m条边的无向图 让你求出从起点到终点的路径的最小值最大
思路:和上一题bfs差不多...
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1000 + 10;
const int maxe = 500000 + 10;
const int INF = 1e9;
struct Edge{
int v, d;
int next;
Edge(int v = 0, int d = 0, int next = 0) :
v(v), d(d), next(next) {}
}edge[maxe];
int n, m, cas = 0;
int Head[maxn], cntE;
int min_dis[maxn];
vector<int> G[maxn];
void init(){
memset(Head, -1, sizeof(Head));
cntE = 0;
for(int i = 0; i < n; i++) G[i].clear();
memset(min_dis, 0, sizeof(min_dis));
min_dis[0] = INF;
}
void add(int u, int v, int d){
edge[cntE] = Edge(v, d, Head[u]);
Head[u] = cntE++;
}
void bfs(){
queue<int> Q;
Q.push(0);
while(!Q.empty()){
int u = Q.front(); Q.pop();
for(int i = Head[u]; ~i; i = edge[i].next){
if(min(min_dis[u], edge[i].d) > min_dis[edge[i].v]){
min_dis[edge[i].v] = min(min_dis[u], edge[i].d);
Q.push(edge[i].v);
}
}
}
}
void solve(){
scanf("%d%d", &n, &m);
init();
for(int i = 0; i < m; i++){
int u, v, d;
scanf("%d%d%d", &u, &v, &d);
--u; --v;
add(u, v, d);
add(v, u, d);
}
bfs();
printf("Scenario #%d:\n%d\n\n", ++cas, min_dis[n-1]);
}
int main()
{
int T;
scanf("%d", &T);
while(T--) solve();
return 0;
}