原题地址:http://poj.org/problem?id=1797
思路;最短路水题.
1.可以用最大生成树来求解,每次加入一条边,当第一次联通目标点的时候的最短距离最是要要求的距离.
2.也可以用dijstra求一边最短路,只不过将更新方法变成如下
if(dis[v] < min(dis[u], G[u][i].w)) {
dis[v] = min(dis[u], G[u][i].w);
q.push(node(v, dis[v]));
}
#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <cctype>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define MOD 1e9+7
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1005;
int n, m;
struct node {
int v;
int w;
node( int b, int c): v(b), w(c) {}
bool operator <(const node &a)const {
return w < a.w;
}
};
vector<node>G[maxn];
bool vis[maxn];
int dis[maxn];
void dij() {
memset(vis, 0, sizeof(vis));
memset(dis, 0, sizeof(dis));
priority_queue<node>q;
dis[1] = INF;
q.push(node(1, INF));
while(!q.empty()) {
int u = q.top().v;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i = 0; i < G[u].size(); i++) {
int v = G[u][i].v;
if(vis[v]) continue;
if(dis[v] < min(dis[u], G[u][i].w)) {
dis[v] = min(dis[u], G[u][i].w);
q.push(node(v, dis[v]));
}
}
}
}
int main() {
int t;
scanf("%d", &t);
for(int cas = 1; cas <= t; cas++) {
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) G[i].clear();
for(int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
G[u].push_back(node(v, w));
G[v].push_back(node(u, w));
}
dij();
printf("Scenario #%d:\n", cas);
printf("%d\n\n", dis[n]);
}
return 0;
}