Codeforces Alpha Round #20 (Codeforces format), problem: (C) Dijkstra? 【极其坑的INF+卡了我半小时 WTF???】

Codeforces Alpha Round #20 (Codeforces format), problem: © Dijkstra?


题目大意

求最短路径


题解

套用堆优化版的Dijkstra 然后需要记录每一次的路径 然后打印

这道题我一开始定义INF直接定义为0x3f3f3f3f,但是我发现这样会一直报错???不知道是为啥,我觉得应该是可以的,毕竟INF是long long64位,,而且这个错误它还不提醒的,直接跑程序的时候会直接卡住然后结束。后来就直接手写了一个10的11次方+5,因为最多有10 ^ 5个点,每个点之间的线最大是10 ^ 6,乘起来就是10^11

最后直接秒AC了,WTF???

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
const ll INF=100000000005;
const int maxn=1e5+10;
int pre[maxn];
ll res[maxn];

struct node{
    ll v,len;
    node(ll v=0,ll len=0):v(v),len(len){}
    bool operator < (const node &a)const{
        return len>a.len;
    }
};
vector<node> G[maxn];
bool vis[maxn];
ll dis[maxn];
void init(){
    for(int i=0;i<maxn;i++){
        G[i].clear();
        vis[i]=false;
        dis[i]=INF;
    }
}
void dijkstra(int s,int e){
    priority_queue<node> Q;
    Q.push(node(s,0));
    dis[s]=0;
    while(!Q.empty()){
        node now=Q.top();
        Q.pop();
        int v=now.v;
        if(vis[v]) continue;
        vis[v]=true;
        for(int i=0;i<G[v].size();i++){
            int v2=G[v][i].v;
            int len=G[v][i].len;
            if(!vis[v2]&&dis[v2]>dis[v]+len){
                dis[v2]=dis[v]+len;
                pre[v2]=v;
                Q.push(node(v2,dis[v2]));
            }
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    init();
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        G[u].push_back(node(v,w));
        G[v].push_back(node(u,w));
    }
    dijkstra(1,n);
    int now=n,cnt=0;
    if(dis[n]>=INF){
        cout<<-1<<endl;
        return 0;
    }
    while(now!=1){
        res[cnt++]=now;
        now=pre[now];
    }
    cout<<"1 ";
    for(int i=cnt-1;i>=0;i--)
        cout<<res[i]<<" ";
    cout<<endl;
    return 0;
}
学如逆水行舟,不进则退
一百个Chocolate CSDN认证博客专家 CSDN博客专家 博客之星 前端开发攻城狮
JS,TS,LeetCode,Vue,React,算法爱好者。
主要分享前端知识,立志成为优秀前端博主。
座右铭:学如逆水行舟,不进则退!
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值