#include<bits/stdc++.h>
#define maxn 7020
#define ll long long
#define INF 1e9
#define maxnn 102000
using namespace std;
struct node {
ll x,w;
node(ll a=0,ll b=0) {
x=a;
w=b;
}
};
vector<pair<ll,ll> > v[maxnn];
priority_queue<node> pq;
bool operator < (const node &a,const node &b) {
return a.w >b.w ;
}
ll dis[maxnn];
ll n,m;
ll h[maxnn];
ll vis[maxnn];
void add(ll a,ll b,ll c) {
v[a].push_back(make_pair(b,c));
}
bool spfa(ll s) {
ll t[maxnn];
memset(t,0,sizeof(t));
queue<ll> q;
memset(h,0x3f,sizeof(h));
h[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty()) {
ll x=q.front();
q.pop();
vis[x]=0;
for(int i=0; i<v[x].size(); i++) {
ll u=v[x][i].first;
ll w=v[x][i].second;
if(h[u]>h[x]+w) {
h[u]=h[x]+w;
if(!vis[u]) {
vis[u]=1;
q.push(u);
t[u]++;
if(t[u]==n+1) return false;
}
}
}
}
return true;
}
void dij(int s) {
// memset(dis,0x3f,sizeof(dis));
for(int i=1; i<=n; i++) dis[i]=INF;
memset(vis,0,sizeof(vis));
dis[s]=0;
pq.push(node(s,dis[s]));
while(!pq.empty()) {
ll x=pq.top().x;
pq.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=0; i<v[x].size(); i++) {
ll y=v[x][i].first;
ll w=v[x][i].second;
if(dis[y]>dis[x]+w) {
dis[y]=dis[x]+w;
if(!vis[y])
pq.push(node(y,dis[y]));
}
}
}
/*ll ans=0;
for(int i=1; i<=n; i++) {
if(dis[i]==0x3f) dis[i]=1000000000;
if(i==s) dis[i]=0;
ans+=i*dis[i];
}
return ans;*/
return;
}
int main() {
cin>>n>>m;
for(int i=1; i<=m; i++) {
ll a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
for(int i=1; i<=n; i++) {
add((ll)0,(ll)i,(ll)0);
}
if(!spfa(0)) {
cout<<-1<<'\n';
return 0;
}
for(int i=1; i<=n; i++) {
for(int j=0; j<v[i].size(); j++) {
v[i][j].second+=h[i]-h[v[i][j].first];
}
}
for(int i=1; i<=n; i++) {
dij(i);
ll ans=0;
for(int j=1; j<=n; j++) {
if(dis[j]==INF) ans+=j*INF;
else ans+=j*(dis[j]+h[j]-h[i]);
}
cout<<ans<<'\n';
}
return 0;
}
这个是错误代码,当时找了很长时间bug,但是发现最后把INF=1000000000 改成 INF=1e9就过了,哪位神仙能帮忙解释一下?(* ╹▽╹ *)