求助全MLE
查看原帖
求助全MLE
541252
Lost_FS楼主2022/9/1 22:15
#include<vector>
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define N 6005
#define INF 1000000000
using namespace std;
struct edge
{
	int to,val;
};
struct node
{
	int id,val;
	bool operator < (const node &a) const
	{
		return val>a.val;
	}
};
vector<edge> e[N*2];
int n,m,dis[N][N],vis[N],num[N],ans;
void AddEdge(int u,int v,int w)
{
	edge edg=(edge){v,w};
	e[u].push_back(edg);
}
bool Spfa(int s)
{
	queue<int> q;
	q.push(s);
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	dis[s][s]=0;
	vis[s]=1;
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(auto i:e[u])
		{
			int v=i.to;
			int w=i.val;
			if(dis[s][u]+w<dis[s][v])
			{
				dis[s][v]=dis[s][u]+w;
				if(!vis[v])
				{
					vis[v]=1;
					q.push(v);
					num[v]++;
				}
				if(num[v]==n+1)
				{
					return 0;
				}
			}
		}
	}
	return 1;
}
void Heap_Dijkstra(int s)
{
	memset(vis,0,sizeof(vis));
	priority_queue<node> q;
	dis[s][s]=0;
	q.push((node){s,dis[s][s]});
	while(!q.empty())
	{
		int u=q.top().id;
		q.pop();
		if(vis[u])
		{
			continue;
		}
		vis[u]=1;
		for(auto i:e[u])
		{
			int v=i.to;
			int w=i.val;
			if(dis[s][u]+w<dis[s][v])
			{
				dis[s][v]=dis[s][u]+w;
				if(!vis[v])
				{
					q.push((node){v,dis[s][v]});
				}
			}
		}
	}
}
void Johnson()
{
	for(int u=1;u<=n;u++)
	{
		AddEdge(0,u,0);
	}
	if(!Spfa(0))
	{
		printf("-1\n");
		return;
	}
	for(int u=1;u<=n;u++)
	{
		for(auto &i:e[u])
		{
			int v=i.to;
			i.val+=dis[0][u]-dis[0][v];
		}
	}
	for(int i=1;i<=n;i++)
	{
		Heap_Dijkstra(i);
	}
	for(int i=1;i<=n;i++)
	{
		ans=0;
		for(int j=1;j<=n;j++)
		{
			if(dis[i][j]>=INF)
			{
				ans+=(LL)j*(LL)INF;
			}
			else
			{
				ans+=(LL)j*((LL)dis[i][j]+(LL)dis[0][j]-(LL)dis[0][i]);
			}
		}
		printf("%lld\n",ans);
	}
}
int main()
{
	freopen("1.in","r",stdin);
	scanf("%d%d",&n,&m);
	int u,v,w;
	while(m--)
	{
		scanf("%d%d%d",&u,&v,&w);
		AddEdge(u,v,w);
	}
	Johnson();
	return 0;
}


2022/9/1 22:15
加载中...