poj3255 次短路模板

版权声明:希望能在自己成长的道路上帮到更多的人,欢迎各位评论交流 https://blog.csdn.net/yiqzq/article/details/79978201
#include <algorithm>
#include <cstdio>
#include <cstring>
#define inf 0x3f3f3f3f
#include <vector>
#include <queue>
using namespace std;
typedef pair<int, int>pii;

const int maxn = 100005;
int dis1[maxn];
int dis2[maxn];
int n, r;
struct edge {
    int to, w;
    edge(int a, int b): to(a), w(b) {};
};
vector<edge>G[maxn];
void dij() {
    memset(dis1, inf, sizeof(dis1));
    memset(dis2, inf, sizeof(dis2));
    priority_queue<pii, vector<pii>, greater<pii> >q;
    dis1[1] = 0;
    q.push(pii(dis1[1], 1));
    while(!q.empty()) {
        int v = q.top().second;
        int d = q.top().first;
        q.pop();
        if(dis2[v] < d)  continue;//buyuyao
        for(int i = 0; i < G[v].size(); i++) {
            edge &e = G[v][i]; //v是最近节点
            int d2 = e.w + d; //d2是经过最近点的更新值
            if(d2 < dis1[e.to]) {
                swap(d2, dis1[e.to]);
                q.push(pii(dis1[e.to], e.to));
            }
            if(dis2[e.to] > d2&&dis1[e.to]<d2) { //不需要多判
                dis2[e.to] = d2;
                q.push(pii(dis2[e.to], e.to));
            }
        }
    }
}
int main() {
    scanf("%d%d", &n, &r);
    for(int i = 1; i <= r; i++) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        G[u].push_back(edge(v, w));
        G[v].push_back(edge(u, w));
    }
    dij();
    printf("%d\n", dis2[n]);
    return 0;
}
阅读更多
想对作者说点什么? 我来说一句
相关热词

没有更多推荐了,返回首页