POJ 3255 Roadblocks(次短路模板题)

本文介绍了一种使用两次 Dijkstra 算法求解带松弛条件的最短路径问题的方法,并通过具体的 C++ 实现展示了如何在给定图中找到从起点到终点的最短路径。该方法首先找到从起点到所有点的最短路径,然后在此基础上进一步松弛以找出最终的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

#include<bits/stdc++.h>

using namespace std;

#define maxn 5005
#define ll long long
typedef pair<int,int>PII;
const int INF = 1e9+7;

int n,r;
int dis[maxn],dis2[maxn];
struct edge{
    int to,cost;
    edge(int x,int y){
        to=x;
		cost=y;
    }
};
vector<edge>G[maxn];

void dijkstra(int s) {
    priority_queue<PII,vector<PII>,greater<PII> >que;
    for(int i=0;i<=n;i++)dis[i]=INF;
    for(int i=0;i<=n;i++)dis2[i]=INF;
    dis[s]=0;
    que.push(PII(0,s));
    while(!que.empty()){
        PII p=que.top();que.pop();
        int v=p.second,d=p.first;
        if(dis2[v]<d)continue;
        for(int i=0;i<G[v].size();i++) {
            edge e=G[v][i];
            int d2=d+e.cost;
            if(dis[e.to]>d2){
                swap(dis[e.to],d2);
                que.push(PII(dis[e.to],e.to));
            }
            if(dis2[e.to]>d2&&dis[e.to]<d2){
                dis2[e.to]=d2;
                que.push(PII(dis2[e.to],e.to));
            }
        }
    }
}
int main()
{
    scanf("%d %d",&n,&r);
    for(int i=0;i<r;++i){
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        G[a].push_back(edge(b,c));
        G[b].push_back(edge(a,c));
    }
    dijkstra(1);
    printf("%d",dis2[n]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值