求助
查看原帖
求助
120340
lc_lca楼主2020/5/27 23:41

为什么我第一个点输出的是负数呢?我感觉我没写错啊,longlong也加了qwq谢谢大佬

include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define int long long
using namespace std;
const int maxn=30010;
struct node{
    int v,w,nxt;
}edge[maxn<<1];
int head[maxn],tot;
void addedge(int u,int v,int w)
{
    edge[tot].v=v;
    edge[tot].w=w;
    edge[tot].nxt=head[u];
    head[u]=tot++;
}
void init()
{
    memset(head,-1,sizeof head);
    tot=0;
}
int n,m;
int _dis[maxn],dis[maxn],vis[maxn],times[maxn];
bool check=false;
void spfa()
{
    queue<int>q;
    memset(_dis,1000000000,sizeof _dis);
    memset(vis,0,sizeof vis);
    _dis[0]=0;
    vis[0]=1;
    q.push(0);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;
        for(int i=head[u];i!=-1;i=edge[i].nxt)
        {
            int v=edge[i].v,w=edge[i].w;
            //cout<<"shit"<<"   "<<v<<" "<<vis[v]<<endl;
            if(_dis[v]>=_dis[u]+w)
            {
                _dis[v]=_dis[u]+w;
                if(!vis[v])
                {
                    //cout<<"fuck   "<<v<<endl;
                    vis[v]=1;
                    times[v]++;
                    if(times[v]>n)
                    {
                        check=true;
                        return;
                    }
                    q.push(v);
                }
            }
        }
    }
}
void dijkstra(int s)
{
    memset(vis,0,sizeof vis);
    memset(dis,0x3f,sizeof dis);
    priority_queue<pair<int,int> >q;
    dis[s]=0;
    q.push(make_pair(0,s));
    //cout<<dis[4]<<"dfuidjfidsugsjdgfsgoifsjd"<<endl;
    while(!q.empty())
    {
        int u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[u];i!=-1;i=edge[i].nxt)
        {
            int v=edge[i].v;
            int w=edge[i].w;
            //cout<<" f**k "<<w<<endl;
            //cout<<"u="<<u<<" v="<<v<<" dis[v]="<<dis[v]<<endl;
            if(dis[v]>=dis[u]+w)
            {
              //  cout<<"v="<<v<<" u="<<u<<" w="<<w<<endl;
                dis[v]=dis[u]+w;
                if(!vis[v]) q.push(make_pair(-dis[v],v));
            }
        }
    }
}
signed main()
{
    init();
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        addedge(u,v,w);
    }
    for(int i=1;i<=n;i++)
    {
        addedge(0,i,0);
    }
    spfa();
    if(check)
    {
        cout<<-1<<endl;
        return 0;
    }
    for(int u=1;u<=n;u++)
    for(int i=head[u];i!=-1;i=edge[i].nxt)
        edge[i].w+=_dis[u]-_dis[edge[i].v];
    for(int i=1;i<=n;i++)
    {
        long long sum=0;
        dijkstra(i);
        for(int j=1;j<=n;j++)
        {
            int dist=dis[j]+_dis[j]-_dis[i];
            if(dist>=1000000000) dist=1000000000;
            //cout<<dist<<endl;
            sum+=j*dist;
        }
        cout<<sum<<endl;
    }
    return 0;
}
2020/5/27 23:41
加载中...