dfs找負環

版权声明:本博客為本人嘔心瀝血之作,未經允許禁止轉載! https://blog.csdn.net/qq_39529862/article/details/84649826

某些無良出題人可能會卡bfs找負環,所以要用dfs
核心代碼(以jzoj5173為例):

#include<bits/stdc++.h>
using namespace std;
#define eps 5e-5
int n,m,v[10010],nxt[10010],h[1010],s,t,ct[1010],inq[1010],ec;
double w[10010],dis[1010];
void add(int x,int y,double z){v[++ec]=y;w[ec]=z;nxt[ec]=h[x];h[x]=ec;}
int dfs(int x){
	inq[x]=1;
	for(int i=h[x];i;i=nxt[i])
		if(dis[v[i]]>dis[x]+w[i]){
			dis[v[i]]=dis[x]+w[i];
			if(inq[v[i]])return 1;
			else if(dfs(v[i]))return 1;
		}
	inq[x]=0;
	return 0;
}
int spfa(){
	memset(inq,0,sizeof(inq));
	memset(dis,0,sizeof(dis));
	for(int i=1;i<=n;i++)
		if(!inq[i]&&dfs(i))return 1;
	return 0;
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int a,b;double c;
		scanf("%d%d%lf",&a,&b,&c);
		add(a,b,c);
	}
	double l=-1,r=10000010;
	while(fabs(r-l)>eps){
		double mid=(l+r)*0.5;
		for(int i=1;i<=ec;i++)
			w[i]-=mid;
		if(spfa())r=mid-eps;
		else l=mid+eps;
		for(int i=1;i<=ec;i++)
			w[i]+=mid;
	}
	if(fabs(l-10000010)<eps)printf("PaPaFish is laying egg!");
	else printf("%.2lf",l);
}

猜你喜欢

转载自blog.csdn.net/qq_39529862/article/details/84649826