求助
查看原帖
求助
457208
telesport楼主2021/9/7 20:25
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pi;
ll cnt,nex[12005],head[12005],to[12005],val[12005],dis[12005],h[12005],n,tot[12005];
bool vis[12005];
void add(ll x,ll y,ll v){
	to[++cnt]=y;
	val[cnt]=v;
	nex[cnt]=head[x];
	head[x]=cnt;
}
queue <ll> q1;
priority_queue <pi> q2;
bool spfa(){
	for(ll i=1;i<=n;i++) h[i]=1e9;
	q1.push(0);
	h[0]=0;
	vis[0]=true;
	while(!q1.empty()){
		ll u=q1.front();
		q1.pop();
		vis[u]=false;
		for(ll i=head[u];i;i=nex[i]){
			ll v=to[i];
			if(h[u]+val[i]<h[v]){
				h[v]=h[u]+val[i];
				if(!vis[v]){
					q1.push(v);
					vis[v]=true;
					tot[v]++;
					if(tot[v]==n+1) return false;
				}
			}
		}
	}
	return true;
}
void dij(ll u){
	for(ll i=1;i<=n;i++) dis[i]=1e9;
	while(!q2.empty()) q2.pop();
	dis[u]=0;
	q2.push(make_pair(dis[u],u));
	while(!q2.empty()){
		u=q2.top().second;
		q2.pop();
		if(vis[u]) continue;
		vis[u]=true;
		for(ll i=head[u];i;i=nex[i]){
			ll v=to[i];
			if(dis[v]>dis[u]+val[i]){
				dis[v]=dis[u]+val[i];
				if(!vis[v]){
					q2.push(make_pair(dis[v],v));
				}
			}
		}
	}
}
int main(){
	ll i,j,m,k,x,y,v,ans=0;
	scanf("%lld%lld",&n,&m);
	for(i=1;i<=m;i++){
		scanf("%lld%lld%lld",&x,&y,&v);
		add(x,y,v);
	}
	for(i=1;i<=n;i++) add(0,i,0);
	if(!spfa()){
		printf("-1");
		return 0;
	}
	for(x=1;x<=n;x++){
		for(i=head[x];i;i=nex[i]) val[i]+=h[x]-h[to[i]];
	}
	for(i=1;i<=n;i++){
		ans=0;
		memset(vis,false,sizeof(vis));
		dij(i);
		for(j=1;j<=n;j++){
			if(i==j) ans+=0;
			else if(dis[j]==1e9) ans+=1e9*j;
			else ans+=j*(dis[j]+h[j]-h[i]);
		}
		printf("%lld\n",ans);
	} 
	return 0;
} 
2021/9/7 20:25
加载中...