已经死了的SPFA求条,会有关注的
查看原帖
已经死了的SPFA求条,会有关注的
563663
xu222ux楼主2024/4/12 19:29
#include<bits/stdc++.h>
#define int long long
using namespace std;
const long long inf=2e18;
int n,m;
vector<pair<int,int>>mp[100005];
int f[100005],no[100005];
bool flag[100005];
void spfa(){
	queue<int>q;
	flag[0]=true;
	q.push(0);
	while(!q.empty()){
		int u=q.front();q.pop();
		flag[u]=false;
		for(auto op:mp[u]){
			int v=op.first,w=op.second;
			if(f[v]>w+f[u]){
				f[v]=f[u]+w;
				if(!flag[v]){
					if(no[v]==n){
						cout<<"-1";
						exit(0);
					}
					no[v]++,flag[v]=true;
					q.push(v);
				}
			}
		}
	}
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)mp[0].push_back({i,1});
	for(int i=1;i<=n;i++)f[i]=inf;
	for(int i=1;i<=m;i++){
		int op,u,v;cin>>op>>u>>v;
		if(op==1){//一样多
			mp[u].push_back({v,0});
			mp[v].push_back({u,0});
		}else if(op==2)mp[v].push_back({u,-1});//少于
		else if(op==3)mp[u].push_back({v,0});//不少于
		else if(op==4)mp[u].push_back({v,-1});//多于
		else mp[v].push_back({u,0});//不多于 
	}
	spfa();
	int mn=inf,ans=0;
	for(int i=1;i<=n;i++)mn=min(mn,f[i]);
	for(int i=1;i<=n;i++)ans+=f[i]-mn;
	//for(int i=1;i<=n;i++)cout<<f[i]<<' ';
	cout<<ans+n;
	return 0;
}

不看TLE,只看WA

2024/4/12 19:29
加载中...