POJ 1797(堆優化dijkstra 求路徑上最小路長度的最大值)

因爲要求路徑上最小路的長度的最大值,可以想到dijkstra思想,優先隊列要維護當前長度大的在隊頂,賦值把dis數組賦爲-INF,源點節點的dis賦爲INF。
每次鄰接表沒清空,看了半小時,汗。

#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
#include <limits.h>
#include <string>
#include <iostream>
#include <queue>
#include <math.h>
#include <map>
#include <stack>
#include <sstream>
#include <set>
#include <iterator>
#include <list>
#include <cstdio>
#include <iomanip>
#include <climits>

#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define forn(i, n) for (int i = 0; i < (int)(n); ++i)
#define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define ford(i, a, b) for (int i = (int)(a); i >= (int)b; --i)
#define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)
#define rep(i, l, r) for (int i = (l); i <= (r); i++)
#define per(i, r, l) for (int i = (r); i >= (l); i--)
#define ms(x, y) memset(x, y, sizeof(x))
#define SZ(x) ((int)(x).size())

using namespace std;

typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<pii> vpi;
typedef vector<vi> vvi;
typedef long long i64;
typedef vector<i64> vi64;
typedef vector<vi64> vvi64;
typedef pair<i64, i64> pi64;
typedef double ld;

template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }

const int maxn = 1100; //點數
const i64 INF = 0x3f3f3f3f;
struct node {
    int id, w;
    node(){}
    node(int a, int b) : id(a), w(b) {}
    friend bool operator < (node a, node b) {return a.w < b.w;}
};
vector<node> G[maxn];
bool vis[maxn];
int dis[maxn];

void dij(int s, int n) {
    priority_queue<node> q;
    node cur;
    ms(vis, 0);
    for (int i = 1; i <= n; ++i) dis[i] = -INF;
    dis[s] = INF;
    q.push(node(s, INF));
    while (!q.empty()) {
        cur = q.top();
        q.pop();
        if (vis[cur.id]) continue;
        vis[cur.id] = 1;
        for (int i = 0; i < SZ(G[cur.id]); ++i) {
            node to = G[cur.id][i];
            if (!vis[to.id] && dis[to.id] < min(dis[cur.id], to.w)) {
                dis[to.id] = min(dis[cur.id], to.w);
                q.push(node(to.id, dis[to.id]));
            }
        }
    }
}
void init(int n) {
    for (int i = 0; i <= n; ++i) G[i].clear();
}

int main() {
#ifdef LOCAL_DEFINE
    freopen("input.txt", "r", stdin);
#endif

    int tc, n, m;
    scanf("%d", &tc);
    for (int k = 1; k <= tc; ++k) {
        scanf("%d%d", &n, &m);
        init(n);
        forn(i, m) {
            int u, v, w;
            scanf("%d%d%d", &u, &v, &w);
            G[u].pb(node(v, w));
            G[v].pb(node(u, w));
        }
        dij(1, n);
        printf("Scenario #%d:\n", k);
        printf("%d\n\n", dis[n]);
    }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章