dijstra的拓展应用

dijstra的松弛操作的条件一般不变
当==也要进行操作时,else if即可(具体见代码)

一般操作是在松弛内进行的

#include<bits/stdc++.h>
using namespace std;
int const N=5e2+7;
int const M=25e4+7;
struct node{
    int a,next,len;
}e[M<<1];
int cnt,head[N];
void add(int x,int y,int len){
    e[++cnt].a =y;
    e[cnt].len =len;
    e[cnt].next =head[x];
    head[x]=cnt;
}
struct L{
    int a,dis;
    friend bool operator<(L a,L b){
        return a.dis > b.dis ;
    }
};
int vis[N],dis[N],maxn[N],num[N],pre[N],last[N],w[N];
void dijstra(int s){
    memset(pre,-1,sizeof pre);
    memset(dis,0x3f,sizeof dis);
    priority_queue<L>pq;num[s]=1;maxn[s]=w[s];
    pq.push((L){s,0});dis[s]=0;pre[s]=-1;
    while(!pq.empty()){
        int u=pq.top().a;pq.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u];i!=-1;i=e[i].next){
            if(dis[u]+e[i].len <dis[e[i].a ]){
                dis[e[i].a ]=dis[u]+e[i].len ;
                pq.push((L){e[i].a ,dis[e[i].a ]});
                num[e[i].a ]=num[u];
                maxn[e[i].a ]=maxn[u]+w[e[i].a ];
                pre[e[i].a ]=u;
            }
            else if(dis[u]+e[i].len ==dis[e[i].a ]){   //
                if(maxn[u]+w[e[i].a ]>maxn[e[i].a ]){
                    pre[e[i].a ]=u;
                    maxn[e[i].a ]=maxn[u]+w[e[i].a ];
                }
                num[e[i].a ]+=num[u];
            }
        }
    }
}
int n,m,s,d;
int main(){
    cin >> n >> m >> s >> d;
    memset(e,-1,sizeof e);
    memset(head,-1,sizeof head);
    for(int i=0;i<=n-1;++i) {
        cin >> w[i];
    }
    for(int i=1,a,b,c;i<=m;++i){
        cin >> a >> b >> c;
        add(a,b,c);add(b,a,c);
    }
    dijstra(s);
    cout << num[d] << " " << maxn[d] << "\n";
    cnt=0;
    for(int i=d;i!=-1;i=pre[i]){
        last[++cnt]=i;
    }
    for(int i=cnt;i>=1;--i){
        cout << last[i];
        if(i!=1) cout << " ";
    }
    return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
10551次浏览 93人参与
# 你的实习产出是真实的还是包装的? #
1855次浏览 42人参与
# 巨人网络春招 #
11324次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7568次浏览 43人参与
# 简历第一个项目做什么 #
31666次浏览 335人参与
# 重来一次,我还会选择这个专业吗 #
433448次浏览 3926人参与
# 米连集团26产品管培生项目 #
5939次浏览 216人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187111次浏览 1122人参与
# 牛客AI文生图 #
21423次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152352次浏览 888人参与
# 研究所笔面经互助 #
118899次浏览 577人参与
# 简历中的项目经历要怎么写? #
310220次浏览 4210人参与
# AI时代,哪些岗位最容易被淘汰 #
63649次浏览 823人参与
# 面试紧张时你会有什么表现? #
30506次浏览 188人参与
# 你今年的平均薪资是多少? #
213077次浏览 1039人参与
# 你怎么看待AI面试 #
180039次浏览 1255人参与
# 高学历就一定能找到好工作吗? #
64324次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76488次浏览 374人参与
# 我的求职精神状态 #
448046次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363373次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160641次浏览 1111人参与
# 校招笔试 #
470896次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务