一直24分 求助
查看原帖
一直24分 求助
472320
Wraith_Fiee楼主2021/7/18 10:03
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack> 
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
typedef pair<int,int> pp;
const int N=5000,M=7000;
const int INF=1e911;
int n,m,tot;
int ver[M],nex[M],edge[M],head[N],cnt[N];
ll d1[N],d[N];
bool v[N];
queue<int> q1;
priority_queue< pp,vector<pp>,greater<pp> > q;
void add(ll x,ll y,ll z)
{
	ver[++tot]=y;
	edge[tot]=z;
	nex[tot]=head[x];
	head[x]=tot;
}
bool spfa(int s)
{
	memset(cnt,0,sizeof(cnt));
	for(int i=1;i<=n;i++) d1[i]=INF;
	memset(v,0,sizeof(v));
	d1[s]=0,v[s]=1,cnt[s]=1;
	q1.push(s);
	while(!q1.empty())
	{
		ll x=q1.front();
		q1.pop();
		v[x]=0;
		for(int i=head[x];i;i=nex[i])
		{
			ll y=ver[i],z=edge[i];
			if(d1[y]>d1[x]+z)
			{
				d1[y]=d1[x]+z;
				cnt[y]=cnt[x]+1;
				if(cnt[y]>n) return false;
				if(!v[y]) 
				{
					q1.push(y);
					v[y]=1;
				}
			}
		}
	}
	return true;
}
void dijkstra(int s)
{
	for(int i=1;i<=n;i++) d[i]=INF;
	memset(v,0,sizeof(v));
	d[s]=0;
	q.push(make_pair(0,s));
	while(!q.empty())
	{
		int x=q.top().second;
		q.pop();
		if(v[x]) continue;
		v[x]=1;
	    for(int i=head[x];i;i=nex[i])
	    {
	    	ll y=ver[i],z=edge[i];
	    	if(d[y]>d[x]+z)
	    	{
	    		d[y]=d[x]+z;
	    		q.push(make_pair(d[y],y));
			}
		}
	}
}
void johnson()
{
	for(int j=1;j<=n;j++)
		for(int i=head[j];i;i=nex[i])
			edge[i]+=d1[j]-d1[ver[i]];
	for(int i=1;i<=n;i++)
	{
		dijkstra(i);
		ll ans=0;
		for(int j=1;j<=n;j++)
		{
			if(d[j]==INF) ans+=j*INF;
			else ans+=j*(d[j]+d1[j]-d1[i]);
		}
		cout<<ans<<endl;
	}	
}
int main()
{
	cin>>n>>m;
	while(m--)
	{
		ll u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	for(int i=1;i<=n;++i) add(0,i,0);
	if(!spfa(0)) cout<<"-1"<<endl;
	else johnson();
	return 0;
}


2021/7/18 10:03
加载中...