时间复杂度为O(n m logm)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define ll long long
#define pb push_back
#define pr make_pair
using namespace std;
const int maxn=3100;
const int maxm=10100;
const int inf=1e9;
ll head[maxn],ver[maxm],edge[maxm],nt[maxm];
ll dis[maxn],d[maxn],sum[maxn],ans=0,n,m,tot;
bool ha[maxn];
void add(ll x,ll y,ll z)
{
ver[++tot]=y,edge[tot]=z;
nt[tot]=head[x],head[x]=tot;
}
bool spfa(ll s)
{
for(int i=0;i<=n;i++)
sum[i]=0,ha[i]=false,dis[i]=inf;
queue<ll>q;
q.push(s);
dis[s]=0;
ha[s]=true;
sum[s]++;
while(q.size())
{
ll x=q.front();
q.pop();
ha[x]=false;
for(int i=head[x];i;i=nt[i])
{
ll y=ver[i],z=edge[i];
if(dis[y]>dis[x]+z)
{
dis[y]=dis[x]+z;
if(!ha[y])
{
q.push(y);
ha[y]=true;
sum[y]++;
if(sum[y]>=n+1) return false;
}
}
}
}
return true;
}
ll dij(ll s)
{
ans=0;
for(int i=1;i<=n;i++)
d[i]=inf,ha[i]=false;
priority_queue<pair<ll,ll> >q;
d[s]=0;
q.push(pr(0,s));
while(q.size())
{
ll x=q.top().second;
q.pop();
if(ha[x]) continue;
ha[x]=true;
for(int i=head[x];i;i=nt[i])
{
ll y=ver[i],z=edge[i];
if(d[y]>d[x]+z)
{
d[y]=d[x]+z;
q.push(pr(-d[y],y));
}
}
}
for(int i=1;i<=n;i++)
{
if(d[i]==inf) ans+=(ll)i*inf;
else ans+=i*(d[i]-dis[s]+dis[i]);
}
return ans;
}
int main(void)
{
ll x,y,z;
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
}
for(int i=1;i<=n;i++)
add(0,i,0);
if(!spfa(0))
{
printf("-1\n");
return 0;
}
for(int x=1;x<=n;x++)
{
for(int i=head[x];i;i=nt[i])
{
int y=ver[i];
edge[i]+=dis[x]-dis[y];
}
}
for(int i=1;i<=n;i++)
printf("%lld\n",dij(i));
return 0;
}