求助,样例第一个输出148,其余正常
查看原帖
求助,样例第一个输出148,其余正常
1234463
yinjunrui楼主2025/2/6 19:03
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define inf LLONG_MAX
using namespace std;
const int N=3e3+5;
int n,m,vis[N],cs[N];
ll h[N],dis[N];
vector<pair<int,int> > e[N];
bool spfa() {
	queue<int> q;
	q.push(0);
	memset(h,63,sizeof(h));
	h[0]=0,vis[0]=1;
	while(!q.empty()) {
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=0; i<e[u].size(); i++) {
			int v=e[u][i].second,w=e[u][i].first;
			if(h[v]>h[u]+w) {
				h[v]=h[u]+w;
				if(!vis[v]) {
					vis[v]=1;
					q.push(v);
					cs[v]++;
					if(cs[v]>n) return 1;
				}
			}
		}
	}
	return 0;
}
void dijk(int x) {
	priority_queue<pair<int,int>> q;
	for(int i=1; i<=n; i++) dis[i]=inf;
	memset(vis,0,sizeof(vis));
	dis[x]=0;
	q.push(make_pair(0,x));
	while(!q.empty()) {
		int u=q.top().second;
		q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(int i=0; i<e[u].size(); i++) {
			int v=e[u][i].second,w=e[u][i].first;
			if(dis[v]>dis[u]+w) {
				dis[v]=dis[u]+w;
				if(!vis[v]) {
					q.push(make_pair(dis[v],v));
				}
			}
		}
	}
	return;
}
int main() {
	cin>>n>>m;
	for(int i=1,u,v,w; i<=m; i++) {
		cin>>u>>v>>w;
		e[u].emplace_back(w,v);
	}
	for(int i=1; i<=n; i++) {
		e[0].emplace_back(0,i);
	}
	if(spfa()) {
		cout<<-1;
		return 0;
	}
	for(int u=1; u<=n; u++) {
		for(int i=0; i<e[u].size(); i++) {
			e[u][i].first+=h[u]-h[e[u][i].second];
		}
	}
	for(int i=1; i<=n; i++) {
		dijk(i);
		ll ans=0;
		for(ll j=1; j<=n; j++) {
			if(dis[j]==inf) {
				ans+=j*1e9;
			} else {
				ans+=j*(dis[j]+h[j]-h[i]);
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
2025/2/6 19:03
加载中...