蒟蒻求调
查看原帖
蒟蒻求调
1183011
yerosius楼主2024/9/2 23:49

孩纸想了好久没想到为什么错了,求助

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define int ll
using pii=pair<int,int>;
int n,m;
const int MAXV=3e3+10;
const int MAXE=6e3+10;
const int INF=1e9;
struct vertex{
	int e=-1;
}v[MAXV];
struct edge{
	int u,v,w,n=-1;
}e[MAXE];
int cntt;
void add(int U,int V,int W){
	e[cntt].u=U,e[cntt].v=V,e[cntt].w=W;
	e[cntt].n=v[U].e;
	v[U].e=cntt++;
}
vector<int>h;
bool spfa(){
	vector<int>cnt(n+1);
	vector<bool>in(n+1);
	queue<int>q;
	h[0]=0,q.push(0),in[0]=1,cnt[0]++;
	for(int i=1;i<=n;i++) add(0,i,0);
	while(q.size()){
		int U=q.front();in[U]=0,q.pop();
		for(int i=v[U].e;~i;i=e[i].n){
			int V=e[i].v,W=e[i].w;
			if(h[U]!=INF&&W!=INF&&h[V]>h[U]+W){
				h[V]=h[U]+W;
				if(!in[V]){
					q.push(V),in[V]=1,cnt[V]++;
					if(cnt[V]>n){
						return 1;
					}
				}
			}
		}
	}
	return 0;
}
vector<vector<int>>dis;
void dijkstra(int s){
	priority_queue<pii,vector<pii>,greater<>>pq;//data index
	vector<bool>S(n+1);
	dis[s][s]=0,pq.push({dis[s][s],s});
	while(pq.size()){
		int U=pq.top().second;
		if(S[U]){
			pq.pop();
			continue;
		}
		S[U]=1,pq.pop();
		for(int i=v[U].e;~i;i=e[i].n){
			int V=e[i].v,W=e[i].w;
			if(!S[V]&&W!=INF&&dis[s][V]>dis[s][U]+W) dis[s][V]=dis[s][U]+W,pq.push({dis[s][V],V});
		}
	}
}
void johnson(){
	bool s=spfa();
	if(s){cout<<-1;return;}
	for(int i=0;i<cntt;i++) e[i].w+=h[e[i].u]-h[e[i].v];
	for(int i=1;i<=n;i++) dijkstra(i);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)
			dis[i][j]+=h[j]-h[i];
	}
	for(int i=1;i<=n;i++){
		ll ans=0;
		for(int j=1;j<=n;j++){
			if(dis[i][j]==INF) ans+=j*INF;
			else ans+=j*dis[i][j];
		}
		cout<<ans<<'\n';
	}
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	while(m--){
		int U,V,W;cin>>U>>V>>W;
		add(U,V,W);
	}
	h.resize(n+1,INF),dis.resize(n+1,vector<int>(n+1,INF));
	johnson();
	return 0;
}
2024/9/2 23:49
加载中...