样例未过求调
查看原帖
样例未过求调
1040409
dhpzy楼主2023/10/10 19:18
#include<bits/stdc++.h>
using namespace std;
long long n,m,dis[1000001],h[1000001],num_edge,head[1000001],sum[1000001];
bool b[1000001],vis[1000001];
struct node{
	int dis,next,to;
}edge[1000001];
struct point{
	int pos,cur;
	bool operator < (const point & x) const
	{
		return x.pos < pos;
	}
};
void add(int from,int to,int dis)
{
	edge[++num_edge]=(node){dis,head[from],to};
	head[from]=num_edge;
}
bool spfa(int s)
{
	for(int i=1;i<=n;i++) h[i]=INT_MAX;
	queue<int>q;
	h[s]=0;
	b[s]=1;
	q.push(s);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		b[u]=0;
		for(int i=head[u];i;i=edge[i].next)
		{
			int v=edge[i].to,d=edge[i].dis;
			if(h[v]>h[u]+d)
			{
				h[v]=h[u]+d;
				if(!b[v])
				{
					sum[v]++;
					if(sum[v]>=n) return 1;
					q.push(v);
					b[v]=1;
				}
			}
		}
	}
	return 0;
}
void dijkstra(int s)
{
	priority_queue<point>q;
	for(int i=1;i<=n;i++) dis[i]=INT_MAX,vis[i]=0;
	dis[s]=0;
	vis[s]=1;
	q.push((point){0,s});
	while(!q.empty())
	{
		point t=q.top();
		q.pop();
		int x=t.cur;
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=head[x];i;i=edge[i].next)
		{
			int u=edge[i].to;
			if(dis[u]>dis[x]+edge[i].dis)
			{
				dis[u]=dis[x]+edge[i].dis;
				if(!vis[u]) q.push((point){dis[u],u});
			}
		}
	}
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v,d;
		scanf("%d%d%d",&u,&v,&d);
		add(u,v,d);
	}
	for(int i=1;i<=n;i++) add(0,i,0);
	if(spfa(0))
	{
		cout<<-1;
		return 0;
	}
	for(int i=1;i<=n;i++)
		for(int j=head[i];j;j=edge[j].next) edge[j].dis+=h[i]-h[edge[j].to];
	for(int i=1;i<=n;i++)
	{
		dijkstra(i);
		long long ans=0;
		for(int j=1;j<=n;j++)
			if(dis[j]==INT_MAX) ans+=j*1e9;
			else ans+=j*(dis[j]+h[j]-h[i]);
		cout<<ans<<endl;
	}
}
2023/10/10 19:18
加载中...