求调 Johnson,但是问题貌似出在 Bellman-Ford
查看原帖
求调 Johnson,但是问题貌似出在 Bellman-Ford
476985
Accelessar楼主2022/11/4 14:19

rt,经过一系列输中量的调试之后发现 h 数组的值好像有问题,但是仔细检查了 Belman-Ford 却找不出错

具体来讲,样例 2 可过,样例 1 输出:

116
1000000120
999999956
1000000046
999999992

但是经查 dis 数组的值没问题

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int N=3e3+10,M=1e4+10,INF=1e9;
int n,m,u,v,w,h[N],dis[N],vis[N];
long long ans;
struct edge{int v,w;edge(int x,int y){v=x,w=y;}};
vector<edge> e[N];

struct node{
    int d,u;
    node(int x,int y){d=x,u=y;}
    bool operator<(const node &b)const{return d>b.d;}
};

bool BellmanFord(int n,int s){
    bool flag;
    for(int i=1;i<=n;i++)h[i]=INF;
    for(int i=1;i<=n;i++){
        flag=0;
        for(int u=0;u<=n;u++){
            if(h[u]==INF)continue;
            for(auto ed:e[u]){
                int v=ed.v,w=ed.w;
                if(h[v]>h[u]+w)
                    h[v]=h[u]+w,flag=1;
            }
        }
        if(!flag)break;
    }
    return flag;
}

void dijkstra(int s){
    priority_queue<node> pq;
    for(int i=1;i<=n;i++)dis[i]=i==s?0:INF,vis[i]=0;
    pq.push(node(0,s));
    while(!pq.empty()){
        int u=pq.top().u;pq.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(auto ed:e[u]){
            int v=ed.v,w=ed.w;
            if(dis[v]>dis[u]+w)
                dis[v]=dis[u]+w,pq.push(node(dis[v],v));
        }
    }
}

int main(){
    cin>>n>>m;
    for(int i=0;i<m;i++)cin>>u>>v>>w,e[u].push_back(edge(v,w));
    for(int i=1;i<=n;i++)e[0].push_back(edge(i,0));
    if(BellmanFord(n,0))puts("-1"),exit(0);
    for(int u=1;u<=n;u++)for(auto ed:e[u])
        ed.w+=h[u]-h[ed.v];
    for(int i=1;i<=n;i++){
        ans=0;
        dijkstra(i);
        for(int j=1;j<=n;j++){
//          cout<<dis[j]<<' ';
//          if(i==2&&j==3)cout<<'\n'<<dis[j]+h[j]-h[i]<<'\n';
            if(dis[j]==INF)ans+=1ll*j*INF;
            else ans+=1ll*j*(dis[j]+h[j]-h[i]);
//          cout<<ans<<' ';
        }
        cout<<ans<<"\n";
    }
    return 0;
}

求大佬们帮忙看看,谢谢!

2022/11/4 14:19
加载中...