和样例稍微有误差,求助
查看原帖
和样例稍微有误差,求助
740948
rb_tree楼主2024/8/30 17:38

rt,用的是Bellman-Ford+Dijkstra的Johnson

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define int long long
const int INF=1e9;
inline void write(int x) 
{
    if(x<0) 
    { 
        x=-x;
        putchar('-');
    }
    if(x>9) write(x/10);
    putchar((x%10)^48);
}
inline int read()
{
    int x=0,w=1;
    char ch=0;
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=(x<<1)+(x<<3)+(ch^'0');
        ch=getchar();
    }
    return x*w;
}
struct edge
{
    int u,v,w;
};
int n,m,cnt,h[3005],to[6005],val[6005],nxt[6005];
vector<edge> g;
inline void add(int a,int b,int c)
{
    to[++cnt]=b;
    val[cnt]=c;
    nxt[cnt]=h[a];
    h[a]=cnt;
    return;
}
int tmp[3005],dis[3005],ans;
inline bool bellmanford(int s)
{
    fill(tmp+1,tmp+n+1,INF);
    tmp[s]=0;
    bool flag=0;
    for(int i=1;i<=n;i++)
    {
        flag=0;
        for(auto j:g)
        {
            int u=j.u,v=j.v,w=j.w;
            if(tmp[u]==INF) continue;
            if(tmp[v]>tmp[u]+w)
            {
                tmp[v]=tmp[u]+w;
                flag=1;
            }
        }
        if(!flag) break;
    }
    return flag;
}
inline void dijkstra(int s)
{
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
    fill(dis+1,dis+n+1,INF);
    dis[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty())
    {
        int u=q.top().second;
        q.pop();
        for(int i=h[u];i;i=nxt[i])
        {
            int v=to[i];
            if(dis[v]>dis[u]+val[i])
            {
                dis[v]=dis[u]+val[i];
                q.push(make_pair(dis[v],v));
            }
        }
    }
    return;
}
inline bool johnson()
{
    for(int i=1;i<=n;i++) g.push_back(edge{0,i,0});
    if(bellmanford(0)) return 1;
    for(int i=0;i<cnt;i++)
    {
        int u=g[i].u,v=g[i].v;
        val[i+1]+=tmp[u]-tmp[v];
    }
    for(int i=1;i<=n;i++)
    {
        dijkstra(i);
        int ans=0;
        for(int j=1;j<=n;j++)
        {
            if (dis[j] == INF) ans += j * INF;
            else ans += j * (dis[j] + h[j] - h[i]);
        }
        write(ans);
        putchar('\n');
    }
    return 0;
}
signed main()
{
    n=read();
    m=read();
    for(int i=1;i<=m;i++)
    {
        int u=read(),v=read(),w=read();
        add(u,v,w);
        g.push_back(edge{u,v,w});
    }
    if(johnson()) write(-1);
    return 0;
}

样例:

5 7
1 2 4
1 4 10
2 3 7
4 5 3
4 2 -2
3 4 -3
5 3 4

样例输出:

128
1000000072
999999978
1000000026
1000000014

我的输出:

201
1000000061
999999995
1000000015
1000000017

目前推测应该是求和的地方有问题

2024/8/30 17:38
加载中...