求助
查看原帖
求助
544571
Locix_Elaina_Celome楼主2022/7/13 21:48

疑似spfa被卡,怎么办

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
#define int long long
int n,kkksc03;int dis[1000005],c[1000005],t[1000005],fir[1000005],las[1000005],inq[1000005],num;
int ct[1000005];
void add(int u,int v,int w){
	c[++num]=w;
	t[num]=v;
	las[num]=fir[u];
	fir[u]=num;
}
int died(int root){
	queue<int> q;
	q.push(root);
	inq[root]=1;
	while(!q.empty()){
		int num=q.front();
		ct[num]++;
		q.pop();
		if(ct[num]>n)return -1;;
		inq[num]=0;
		for(int i=fir[num];i!=0;i=las[i]){
			if(dis[t[i]]<dis[num]+c[i]){
				dis[t[i]]=dis[num]+c[i];
				if(inq[t[i]] == 0){
					inq[t[i]]=1;
					q.push(t[i]);
				}
			}
		}
	}
	return 0;
}
 main(){
	
	scanf("%lld%lld",&n,&kkksc03);
	int x,a,b;
	for(int i=1;i<=kkksc03;i++){
		scanf("%lld%lld%lld",&x,&a,&b);
		if(x == 1){
			add(a,b,0);
			add(b,a,0);
		}
		else if(x == 2){
			add(a,b,1);
		}
		else if(x == 3){
			add(b,a,0);
		}
		else if(x == 4){
			add(b,a,1);
		}
		else{
			add(a,b,0);
		}
	}
	for(int i=1;i<=n;i++)add(n+1,i,	1);
	n++;
	int xxx=died(n);
	n--;
	if(xxx==-1){
		cout<<-1;
		return 0;
	}
	int sum=0,mn=1e9;
	for(int i=1;i<=n;i++){
		sum+=dis[i];
		mn=min(mn,dis[i]);
	}
	cout<<sum;
}
2022/7/13 21:48
加载中...