24pts
查看原帖
24pts
886055
MoonCake2011楼主2023/5/4 11:50
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
int n,m;
int head[int(3e3)+10],st[int(6e3)+10],to[int(6e3)+10],val[int(6e3)+10],nxt[int(6e3)+10],tot;
int f[int(3e3)+10];
void add(int u,int v,int w){
	st[++tot]=u,to[tot]=v,val[tot]=w;
	nxt[tot]=head[u];
	head[u]=tot;
}
bool bellman(){
	memset(f,0x3f,sizeof f);
	f[0]=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=tot;j++)
			f[to[j]]=min(f[to[j]],f[st[j]]+val[j]);
	for(int j=1;j<=tot;j++)
		if(f[to[j]]>f[st[j]]+val[j])
			return false;
	return true;
}
int dis[int(3e3)+10][int(3e3)+10];
bool vis[int(3e3)+10];
priority_queue<PII,vector<PII>,greater<PII> >q;
void dij(int st){
	memset(vis,0,sizeof vis);
	dis[st][st]=0;
	q.push({0,st});
	while(!q.empty()){
		PII u=q.top();
		q.pop();
		int id=u.second,vl=u.first;
		if(vis[id]) continue;
		vis[id]=1;
		for(int i=head[id];i;i=nxt[i])
			if(dis[st][to[i]]>dis[st][id]+val[i])
				dis[st][to[i]]=dis[st][id]+val[i],q.push({dis[st][to[i]],to[i]});
	}
}
int 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);
	bool p=bellman();
	if(!p){
		cout<<-1;
		return 0;
	}
	for(int i=1;i<=tot;i++)
		val[i]+=f[st[i]]-f[to[i]];
	memset(dis,0x3f,sizeof dis);
	for(int i=1;i<=n;i++)
		dij(i);
	for(int i=1;i<=n;i++){
		long long ans=0;
		for(long long j=1;j<=n;j++)
			if(dis[i][j]>=90000000)
				ans+=j*100000000;
			else
				ans+=j*(dis[i][j]+f[j]-f[i]);
		cout<<ans<<"\n";
	}
	return 0;
}
2023/5/4 11:50
加载中...