POJ 1797 Heavy Transportation(最短路使最小路径最大化)

原题地址: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;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/81259701