如题,已经把主体部分全部改成题解了,还是不过.
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
const long long INF=1e9;
struct Ed
{
int nxt,to,w;
}e[6005];
int head[3005],dis[3005];
bool vis[3005];
int h[3005];
int t[10005];
int cnt;
void add(int x,int y,int w)
{
e[++cnt].w=w;
e[cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
}
bool spfa(int s) {
queue<int> q;
memset(h, 63, sizeof(h));
h[s] = 0, vis[s] = 1;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
vis[u] = 0;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (h[v] > h[u] + e[i].w) {
h[v] = h[u] + e[i].w;
if (!vis[v]) {
vis[v] = 1;
q.push(v);
t[v]++;
if (t[v] == n + 1) return false;
}
}
}
}
return true;
}
void dij(int s) {
priority_queue<int,vector<pair<int,int> >,greater<pair<int,int> > > q;
for (int i = 1; i <= n; i++) dis[i] = INF;
memset(vis, 0, sizeof(vis));
dis[s] = 0;
q.push(make_pair(0, s));
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
if (!vis[v]) q.push(make_pair(dis[v], v));
}
}
}
}/* */
signed main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
}
for (int i = 1; i <= n; i++) add(0, i, 0);
/* for(int i=1;i<=m;i++)
{
int x,y,l;
scanf("%lld %lld %lld",&x,&y,&l);
add(x,y,l);
}
for(int i=1;i<=n;i++)
{
add(0,i,0);
} */
if(!spfa(0))
{
printf("-1\n");
return 0;
}
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=e[j].nxt)
{
e[i].w+=h[i]-h[e[j].to];
}
}
for (int i = 1; i <= n; i++) {
dij(i);
long long 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 << endl;
}
return 0;
}