RT,AC前5个点
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int cnt;
const int maxn = 6e3+10;
const int INF = 1e9;
int head[maxn<<2],nex[maxn<<2],to[maxn<<2],val[maxn<<2],from[maxn<<2];
int d[maxn],dis[maxn];
bool vis[maxn];
int ans;
struct node{
int dis,num;
};
bool operator < (node x,node y){
return x.dis > y.dis;
}
priority_queue<node> q;
void add(int u,int v,int w){
nex[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
val[cnt] = w;
from[cnt] = u;
}
bool test(){
cout << "FuckCCF" << endl;
return true;
}
bool BF(){
memset(d,0x3f,sizeof(d));
d[n] = 0;
bool flag = false;
for(int i = 1;i <= n;i++){
flag = false;
for(int j = 1;j <= n;j++){
if(d[j] > INF){
continue;
}
for(int k = head[j];k;k = nex[k]){
if(d[from[k]] + val[k] < d[to[k]]){
d[to[k]] = d[from[k]]+val[k];
flag = true;
}
}
}
if(!flag){
break;
}
}
return !flag;
}
void dij(int s){
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[s] = 0;
while(!q.empty()){
q.pop();
}
q.push((node){0,s});
node now;
while(!q.empty()){
now = q.top(); q.pop();
if(vis[now.num] == true){ continue;} vis[now.num] = true;
for(int i = head[now.num];i;i = nex[i]){
if(dis[now.num]+val[i] < dis[to[i]]){
dis[to[i]] = dis[now.num]+val[i];
q.push((node){dis[to[i]],to[i]});
}
}
}
}
signed main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
cin >> n >> m;
int u,v,w;
for(int i = 1;i <= m;i++){
scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
}
for(int i = 1;i <= n;i++){
add(n+1,i,0);
}
n++;
if(BF() == false){
cout << -1 << endl;
return 0;
}
n--;
for(int i = 1;i <= m;i++){
val[i] += d[from[i]]-d[to[i]];
}
for(int i = 1;i <= n;i++){
ans = 0;
dij(i);
for(int j = 1;j <= n;j++){
if(dis[j] >= INF){
dis[j] = INF;
}
}
for(int j = 1;j <= n;j++){
ans += j*(dis[j]+d[j]-d[i]);
}
cout << ans << endl;
}
return 0;
}
/*
Author: qige_mingzi
Start thinking at
Start coding at 16:17
Finish coding at 16:54
Finish debugging at
*/