Johnson全源最短路 WA60pts 求调
  • 板块学术版
  • 楼主Polaris_flame
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/11 15:58
  • 上次更新2023/11/3 04:28:05
查看原帖
Johnson全源最短路 WA60pts 求调
1046448
Polaris_flame楼主2023/8/11 15:58

提交记录

题目link

#include<bits/stdc++.h>
#define FL(i,a,b) for(int i=(a);i<=(b);i++)
#define FR(i,a,b) for(int i=(a);i>=(b);i--)
#define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int MAXN = 3e3 + 10;
const int MAXM = 6e3 + 10;
int n, m, cnt, head[MAXN], dis[MAXN], d[MAXN], num[MAXN];
bool vis[MAXN];

struct edge{
	int v,w,nxt;
}e[MAXM<<1];

queue<int> q;

void add (int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}

bool spfa (int x){
	dis[x]=0;
	q.push(x);
	vis[x]=1;
	num[x]++;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		vis[u]=1;
		for(int i=head[u];i;i=e[i].nxt){
			if (dis[e[i].v]>dis[u]+e[i].w){
				dis[e[i].v]=dis[u]+e[i].w;
				if(!vis[e[i].v]){
					q.push(e[i].v);
					vis[e[i].v]=1;
					num[e[i].v]++;
					if(num[e[i].v]==n+1) return 0;
				}
			}
		}
	}
	return true;
}

struct node {
	int dis,id;
};

bool operator<(node x,node y){
	return x.dis>y.dis;
}

void dijkstra(int x){
	priority_queue<node> q;
	d[x]=0;
	q.push({0,x});
	while(!q.empty()){
		node u=q.top();
		q.pop();
		if(vis[u.id]) continue;
		vis[u.id]=1;
		for(int i=head[u.id];i;i=e[i].nxt){
			if(d[e[i].v]>d[u.id]+e[i].w){
				d[e[i].v]=d[u.id]+e[i].w;
				q.push({d[e[i].v],e[i].v});
			}
		}
	}
}

int main(){
	memset(dis, inf, sizeof(dis));
	scanf("%d%d",&n,&m);
	FL(i,1,m){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
	}
	FL(i,1,n) add(n+1,i,0);
	bool flag=spfa(n+1);
	if(!flag){
		puts("-1");
		return 0;
	}
	FL(i,1,n){
		for(int j=head[i];j;j=e[j].nxt){
			e[j].w+=dis[i]-dis[e[j].v];
		}
	}
	FL(i,1,n){
		memset(d,inf,sizeof(d));
		memset(vis,0,sizeof(vis));
		dijkstra(i);
		ll ans=0;
		FL(j,1,n){
			if(d[j]==inf) ans+=1ll*1e9*j;
			else{
				ans+=1ll*(d[j]-dis[i]+dis[j])*j;
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
}
2023/8/11 15:58
加载中...