24分求助
查看原帖
24分求助
214649
Real_Create楼主2020/12/17 13:28

RT

#include<bits/stdc++.h>
using namespace std;
int cs[30005],n;
long long zdl[30005],h[30005];
vector<int>lj[30005],bq[30005];
int a[30005],ddr,lsh[30005];
bool v[30005];
inline bool dnpx(int x,int y)
{
	return zdl[a[x]]>zdl[a[y]];
}
void push_up(int x)
{
	if(x==1)
	{
		return;
	}
	if(dnpx(x/2,x))
	{
		swap(a[x/2],a[x]);
		swap(lsh[a[x]],lsh[a[x/2]]);
		push_up(x/2);
	}
}
void push_down(int x)
{
	if(x*2>ddr)
	{
		return;
	}
	if(x*2+1>ddr)
	{
		if(dnpx(x,x*2))
		{
			swap(a[x*2],a[x]);
			swap(lsh[a[x]],lsh[a[x*2]]);
			push_down(x*2);
		}
		return;
	}
	if(dnpx(x*2,x*2+1))
	{
		if(dnpx(x,x*2+1))
		{
			swap(a[x],a[x*2+1]);
			swap(lsh[a[x]],lsh[a[x*2+1]]);
			push_down(x*2+1);
		}
	}else
	{
		if(dnpx(x,x*2))
		{
			swap(a[x*2],a[x]);
			swap(lsh[a[x]],lsh[a[x*2]]);
			push_down(x*2);
		}
	}
}
inline void fr(int x)
{
	ddr++;
	a[ddr]=x;
	lsh[x]=ddr;
	push_up(ddr);
}
inline void qc()
{
	lsh[a[1]]=0;
	a[1]=a[ddr];
	ddr--;
	push_down(1);
}
inline void xg(int x,int k)
{
	zdl[x]=k;
	push_up(lsh[x]);
}
inline void dij(int x)
{
	for(int i=0;i<3005;i++)
	{
		zdl[i]=1000000000;
		lsh[i]=0;
	}
	zdl[x]=0;
	ddr=0;
	fr(x);
	while(ddr>=1)
	{
		for(int i=0;i<lj[a[1]].size();i++)
		{
			if(zdl[lj[a[1]][i]]>zdl[a[1]]+bq[a[1]][i])
			{
				if(lsh[lj[a[1]][i]]==0)
				{
					zdl[lj[a[1]][i]]=zdl[a[1]]+bq[a[1]][i];
					fr(lj[a[1]][i]);
				}else
				{
					xg(lj[a[1]][i],zdl[a[1]]+bq[a[1]][i]);
				}
			}
		}
		qc();
	}
}
inline bool dead(int x)
{
	queue<int>q;
	for(int i=0;i<3005;i++)
	{
		h[i]=1000000000;
	}
	q.push(x);
	h[x]=0;
	v[x]=1;
	while(q.size())
	{
		for(int i=0;i<lj[q.front()].size();i++)
		{
			if(h[lj[q.front()][i]]>h[q.front()]+bq[q.front()][i])
			{
				h[lj[q.front()][i]]=h[q.front()]+bq[q.front()][i];
				if(!v[lj[q.front()][i]])
				{
					v[lj[q.front()][i]]=1;
					q.push(lj[q.front()][i]);
					cs[lj[q.front()][i]]++;
					if(cs[lj[q.front()][i]]==n+1)
					{
						return 1;
					}
				}
			}
		}
		v[q.front()]=0;
		q.pop();
	}
	return 0;
}
int main()
{
	int t;
	cin>>n>>t;
	while(t--)
	{
		int x,y,qwq;
		cin>>x>>y>>qwq;
		lj[x].push_back(y);
		bq[x].push_back(qwq);
	}
	for(int i=1;i<=n;i++)
	{
		lj[0].push_back(i);
		bq[0].push_back(0);
	}
	if(dead(0))
	{
		cout<<-1;
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<lj[i].size();j++)
		{
			bq[i][j]+=h[i]-h[lj[i][j]];
		}
	}
	for(int i=1;i<=n;i++)
	{
		dij(i);
		long long ans=0;
		for(int j=1;j<=n;j++)
		{
			if(zdl[j]==1000000000)
			{
				ans+=1000000000*j;
			}else
			{
				ans+=(zdl[j]+h[j]-h[i])*j;
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}
2020/12/17 13:28
加载中...