求助,调一下午了
查看原帖
求助,调一下午了
270854
二叉苹果树楼主2022/8/10 19:07
#include<bits/stdc++.h>
using namespace std;
const int maxn=300005;
const int MAX=1000000000;
long long int dis[maxn];
struct edge
{
    int v,w;
};
struct node
{
    int dis,u;
    bool operator<(const node& a) const {return dis>a.dis;}
};
int h[30005];
vector<edge>e[maxn];
vector<edge>E[maxn];
long long cnt[maxn],vis[maxn];
queue<int>q;
void dijkstra(int n,int s)
{
    priority_queue<node>pq;
    dis[s]=0;
    for(int i=1;i<=n;i++)
        dis[i]=MAX;
    pq.push((node){0,s});
    while(!pq.empty())
    {
        int u=pq.top().u;
        pq.pop();
        if(vis[u])
            continue;
        vis[u]=true;
        for(int j=0;j<E[u].size();j++)
        {
            edge ed=E[u][j];
            int v=ed.v,w=ed.w;
            if(dis[v]>dis[u]+w)
                dis[v]=dis[u]+w,pq.push((node){dis[v],v});
        }
    }
    return ;
}
bool spfa(int n,int s)
{
    for(int i=1;i<=n;i++)
        h[i]=MAX,vis[i]=false;
    h[s]=0,vis[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop(),vis[u]=0;
        for(auto ed:e[u])
        {
            int v=ed.v,w=ed.w;
            if(h[v]>h[u]+w)
            {
                h[v]=dis[u]+w;
                cnt[v]=cnt[u]+1;
                if(cnt[v]>=n)
                    return 0;
                if(!vis[v])
                    q.push(v),vis[v]=1;
            }
        }
    }
    return 1;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        e[u].push_back((edge){v,w});
    }
    for(int i=1;i<=n;i++)
        e[0].push_back((edge){i,0});
    bool flag=spfa(n,0);
    if(flag==0)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    for(int i=1;i<=n;i++)
        for(int j=0;j<e[i].size();j++)
            E[i].push_back((edge){e[i][j].v,e[i][j].w+dis[i]-dis[e[i][j].v]});
    for(int i=1;i<=n;i++)
    {
        long long ans=0;
        dijkstra(n,i);
        for(int j=1;j<=n;j++)
            if(dis[j]==MAX)
                ans+=MAX;
            else
                ans+= j * (dis[j] + h[j] - h[i]);
        cout<<ans<<endl;
    }
    return 0;
}

都几乎成对着SF的代码抄了还没抄对()

2022/8/10 19:07
加载中...