为什么我第一个点输出的是负数呢?我感觉我没写错啊,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;
}