POJ 1797 最短路变形

起点1 终点n 有m条双向路,值为val,
找出从1到n的所有路径中
{
路径所经过的所有边的val值的最小值
}的最大值

开Dijkstra 把路径和改成最小值,剩下的就好说了,逻辑和正常的最短路差不多,每次都能确认一个点的最优解。

用kuangbin的板子改的

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
#ifdef Wang_Zhifeng
#define debug(x)  cout << #x << ": " << x << endl;
#endif
/*
* 使用优先队列优化 Dijkstra 算法
* 复杂度 O(ElogE)
* 注意对 vectorE[MAXN] 进行初始化后加边
*/
const int inf = 0x3f3f3f3f;
const int MAXN = 1000010;

struct qnode {
    int v;
    int c;

    qnode(int _v = 0, int _c = 0) : v(_v), c(_c) {}

    bool operator<(const qnode &r) const {
        return c < r.c;
    }
};

struct Edge {

    int v, cost;

    Edge(int _v = 0, int _cost = 0) : v(_v), cost(_cost) {}
};

vector E[MAXN];
bool vis[MAXN];
int dist[MAXN];

//点的编号从 1 开始
void Dijkstra(int n, int start) {
    memset(vis, false, sizeof(vis));
    for(int i = 1; i <= n; i++)dist[i] = 0;
    dist[1]=inf;
    priority_queue que;
    while(!que.empty())que.pop();
    que.push(qnode(start, 0));
    qnode tmp;
    while(!que.empty()) {
        tmp = que.top();
        que.pop();
        int u = tmp.v;
        if(vis[u])continue;
        vis[u] = true;
        for(int i = 0; i < E[u].size(); i++) {
            int v = E[tmp.v][i].v;
            int cost = E[u][i].cost;
            if(!vis[v] && dist[v] < min(dist[u], cost)) {
                dist[v] = min(dist[u], cost);
                que.push(qnode(v, dist[v]));
            }
        }
    }
}

void addedge(int u, int v, int w) {
    E[u].push_back(Edge(v, w));
}

int n, t, m;
int tmp[3];

int main() {
#ifdef Wang_Zhifeng
//    freopen("in.txt", "r", stdin);
    setvbuf(stdout, NULL, _IOFBF, 1024);
//    std::ios::sync_with_stdio(false);
//    cin.tie(0);
#endif
    scanf("%d", &t);
    for(int cnt = 1; cnt <= t; ++cnt) {
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; ++i) E[i].clear();

        for(int i = 1; i <= m; ++i) {
            scanf("%d%d%d", &tmp[0], &tmp[1], &tmp[2]);
            addedge(tmp[0], tmp[1], tmp[2]);
            addedge(tmp[1], tmp[0], tmp[2]);
        }
        Dijkstra(n, 1);
        printf("Scenario #%d:\n", cnt);
        printf("%d\n\n", dist[n]==inf ? 0 : dist[n]);
    }
    return 0;
}

你可能感兴趣的:(POJ 1797 最短路变形)