92pts求助,TLE on #8
查看原帖
92pts求助,TLE on #8
574215
OneLeft楼主2023/11/4 10:26

rt

code:

#include<bits/stdc++.h>
#define int long long
#define PII pair<int,int>
using namespace std;
const int N=3e3+5,INF=0x3f3f3f3f3f3f3f3f;
struct Edge
{
	int v,w;
};
bool vis[N];
int n,m,u,v,w,dis[N][N];
vector<Edge>edge[N];
void build(int u,int v,int w)
{
	edge[u].push_back((Edge){v,w});
}
bool bellman_ford(int start)
{
	memset(dis[start],127,sizeof dis[start]);
	dis[start][start]=0;
	bool flag;
	for(int i=1;i<=n;i++)
	{
		flag=false;
		for(int u=1;u<=n;u++)
		for(auto tmp:edge[u])
		{
			int v=tmp.v,w=tmp.w;
			if(dis[start][v]>dis[start][u]+w)
				dis[start][v]=dis[start][u]+w,flag=true;
		}
		if(!flag)break;
	}
	return flag;
}
void dijkstra(int start)
{
	memset(vis,false,sizeof vis);
	memset(dis[start],127,sizeof dis[start]);
	priority_queue<PII,vector<PII>,greater<PII> >que;
	dis[start][start]=0,que.push(make_pair(0,start));
	while(!que.empty())
	{
		int u=que.top().second;
		vis[u]=true,que.pop();
		for(auto tmp:edge[u])
		{
			int v=tmp.v,w=tmp.w;
			if(!vis[v]&&dis[start][v]>dis[start][u]+w)
			{
				dis[start][v]=dis[start][u]+w;
				que.push(make_pair(dis[start][v],v));
			}
		}
	}
}
void johnson()
{
	for(int i=1;i<=n;i++)
		build(0,i,0);
	bool flag=bellman_ford(0);
	if(flag)
	{
		cout<<-1;
		return;
	}
	for(int u=1;u<=n;u++)
	for(int i=0;i<edge[u].size();i++)
		edge[u][i].w+=dis[0][u]-dis[0][edge[u][i].v];
	for(int u=1;u<=n;u++)
		dijkstra(u);
	for(int i=1;i<=n;i++)
	{
		int ans=0;
		for(int j=1;j<=n;j++)
		{
			dis[i][j]-=dis[0][i]-dis[0][j];
			if(i==j)dis[i][j]=0;
			if(dis[i][j]>=INF)dis[i][j]=1e9;
			ans+=j*dis[i][j];
		}
		cout<<ans<<'\n';
	}
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
		cin>>u>>v>>w,build(u,v,w);
	johnson();
	return 0;
}
2023/11/4 10:26
加载中...