WA on #11 以往帖子的方法都无效
查看原帖
WA on #11 以往帖子的方法都无效
886055
MoonCake2011楼主2023/7/31 14:26
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int n,m;
int head[int(3e3)+10],now[int(2e4)+10],to[int(2e4)+10],val[int(2e4)+10],nxt[int(2e4)+10],tot;
void add(int u,int v,int w){
	to[++tot]=v,now[tot]=u,val[tot]=w;
	nxt[tot]=head[u];
	head[u]=tot;
}
int f[int(3e3)+10],cnt[int(3e3)+10];
bool vis[int(3e3)+10];
bool spfa(int st){
	list<int>q;
	memset(f,0x3f,sizeof f);
	memset(cnt,0,sizeof cnt);
	f[st]=0;
	q.push_back(st);
	while(!q.empty()){
		int u=q.front();
		q.pop_front();
		cnt[u]++;
		if(cnt[u]>n+1) return true;
		vis[u]=0;
		for(int i=head[u];i;i=nxt[i]){
			if(f[to[i]]>f[u]+val[i]){
				f[to[i]]=f[u]+val[i];
				if(vis[to[i]]) continue;
				vis[to[i]]=1;
				if(f[to[i]]<f[q.front()]) q.push_front(to[i]);
				else q.push_back(to[i]);
			}
		}
	}
	return false;
}
int dis[int(3e3)+10];
void dij(int st){
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
	memset(dis,0x3f,sizeof dis);
	memset(vis,0,sizeof vis);
	dis[st]=0;
	q.push({0,st});
	while(!q.empty()){
		pair<int,int>u=q.top();
		q.pop();
		int id=u.second;
		if(vis[id]) continue;
		vis[id]=1;
		for(int i=head[id];i;i=nxt[i]){
			if(dis[to[i]]>dis[id]+val[i])
				dis[to[i]]=dis[id]+val[i],q.push({dis[to[i]],to[i]});
		}
	}
}
int main() {
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
	}
	for(int i=1;i<=n;i++)
		add(0,i,0);
	bool p=spfa(0);
	if(p){
		cout<<-1;
		return 0;
	}
	for(int i=1;i<=m;i++)
		val[i]+=f[now[i]]-f[to[i]];
	for(int i=1;i<=n;i++){
		long long ans=0;
		dij(i);
		for(long long j=1;j<=n;j++){
			if(dis[j]<=5e8) ans+=(dis[j]-f[i]+f[j])*j;
			else ans+=1e9*j;
		}
		cout<<ans<<"\n";
	}
	return 0;
}
2023/7/31 14:26
加载中...