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;
}
全部评论

相关推荐

09-17 19:25
已编辑
太原理工大学 游戏测试
叁六玖:公司名发我,我要这个HR带我打瓦
我的秋招日记
点赞 评论 收藏
分享
10-13 13:49
南京大学 财务
饿魔:笑死我了,你简直是个天才
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务