SPFA球条(旋棺
查看原帖
SPFA球条(旋棺
892084
xinxin2022楼主2024/7/18 11:24

0pts

#include<bits/stdc++.h>
using namespace std;
int n,m,a,b;
int r[100005],total;
int r2,r3;
bitset<100005> v;
int dis[100005],head[100005];
struct node{
    int fr,to,val;
}e[200005];
void spfa(){
    queue<int> q;
    q.push(a);
    while(!q.empty()){
        int rp=q.front();
        q.pop();
        v[rp]=false;
        for(int i=head[rp];i;i=e[i].fr){
            if(dis[rp]+e[i].val<dis[e[i].to]){
                dis[e[i].to]=dis[rp]+e[i].val;
                if(!v[e[i].to]){
                    q.push(e[i].to);
                    v[e[i].to]=true;
                }
            }
        }
    }
}
int main(){
    cin>>n>>m;
    cin>>a>>b;
    for(int i=0;i<n;++i) cin>>r[i];
    for(int i=1;i<=m;i++){
        scanf("%d%d",&r2,&r3);
        e[++total].fr=head[r2];
        e[total].to=r3;
        e[total].val=r[r3]-r[r2]+1;
    }
    for(int i=1;i<=n;i++) dis[i]=INT_MAX;
    dis[a]=0;
    spfa();
    if(dis[b]==INT_MAX) cout<<"No solution";
    else cout<<dis[b];
    return 0;
}
2024/7/18 11:24
加载中...