【模板】POJ-1502(dijkstra)

POJ-1502

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PI;
const int N = 105;
const int INF = 0x3f3f3f3f;

struct Edge
{
    int to, dis;
};
vector<Edge> G[N]; //邻接表存图,G[i].to/dis i与to之间的边权值为dis
int n, m, s;
int d[N][N];

void dijkstra() {
    priority_queue<PI, vector<PI>, greater<PI> > q; //按first从小到大出队,first最短路径second顶点编号
    for (int i = 0; i <= n; i++) d[s][i] = INF;
    d[s][s] = 0;
    q.push({0, s});
    while (!q.empty()) {
        PI tmp = q.top(); q.pop(); //有可能进行松弛的点,<与源点的距离,编号>
        int v = tmp.second;
        if (d[s][v] < tmp.first) continue; //如果当前(点与源点的距离)不是最短距离,则没必要进行松弛操作
        for (int i = 0; i < G[v].size(); i++) { //遍历当前点的所有出边
            Edge e = G[v][i]; //e代表与v相连的边
            if (d[s][e.to] > d[s][v] + e.dis) { //如果源点到(e的另一端点)的距离>源点与v的距离+e的权值,则进行松弛
                d[s][e.to] = d[s][v] + e.dis;
                q.push({d[s][e.to], e.to});
            }
        }
    }
}

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) G[i].push_back({i, 0});
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j < i; j++) {
            string val; cin >> val;
            if (val == "x") {
                G[i].push_back({j, INF});
                G[j].push_back({i, INF});
            } else {
                G[i].push_back({j, atoi(val.c_str())});
                G[j].push_back({i, atoi(val.c_str())});
            }
        }
    }
    s = 1;
    dijkstra();
    int ans = -INF;
    for (int i = 1; i <= n; i++) ans = max(ans, d[1][i]);
    cout << ans << endl;
    return 0;
}
posted @ 2020-09-09 18:02  Nepenthe8  阅读(78)  评论(0编辑  收藏  举报