8pts求调奖关注
查看原帖
8pts求调奖关注
929151
xxr___楼主2024/1/7 11:38
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=3e3+5;
#define int long long
vector<pair<int,int>> g[N];
const int inf=1e9;
int d[N],inv[N];
int h[N];
bool vs[N];
void dij(int s){
	memset(vs,0,sizeof(vs));
	for(int i=1;i<=n;i++)d[i]=inf;
	d[s]=0;
	priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int> > > q;
	q.push({d[s],s});
	while(q.size()){
		auto T=q.top();
		int u=T.first;q.pop();
		if(vs[u])continue;
		vs[u]=1;
		for(auto G:g[u]){
			int v=G.first,w=G.second;
			if(d[v]>d[u]+w){
				d[v]=d[u]+w;
				q.push({d[v],v}); 
			}
		}
	} 
}
signed main(){
	cin>>n>>m;
	
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].push_back({v,w});
	}
	for(int i=1;i<=n;i++){
		h[i]=inf;
	}
	for(int i=1;i<=n;i++){
		g[0].push_back({i,0}); 
	}
	h[0]=0;
	vs[0]=1;
	queue<int> q;
	q.push(0);
	while(q.size()){
		int u =q.front();q.pop() ;
		vs[u]=0;
		for(auto G:g[u]){
			int v=G.first,w=G.second;
			if(h[v]>h[u]+w){
				h[v]=h[u]+w;
				if(!vs[v]){
					vs[v]=1;
					q.push(v);
					inv[v]++;
					if(inv[v]>n+1){
						puts("-1");
						return 0;
					}
				}
			}
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=0;j<(long long)g[i].size();j++){
			g[i][j].second+=h[i]-h[g[i][j].first];
		}
	}	
	for(int i=1;i<=n;i++){
		dij(i);
		long long ans=0;
		for(int j=1;j<=n;j++){
			if(d[j]==inf){
				ans+=1ll*j*inf;
			}else{
				ans+=1ll*j*(d[j]+h[j]-h[i]);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
2024/1/7 11:38
加载中...