精度也太恶心了吧
查看原帖
精度也太恶心了吧
236970
yewanxingkong楼主2020/10/22 20:24
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,m,dian[1010],hd[1010],ji,dui[100000],head,tail=1,cnt[1010],t;
bool biao[1010];
double bian[1010];
struct nod{
	int xu,zhi,nxt;
}cun[5010];
inline void add(int a,int b,int c){
	cun[++ji].xu=b;
	cun[ji].zhi=c;
	cun[ji].nxt=hd[a];
	hd[a]=ji;
}
inline bool spfa(double da,int o){
	memset(biao,0,sizeof(biao));
	head=0;
	tail=1;
	bian[o]=0;
	dui[tail++]=o;
	biao[o]=1;
	while(head<tail){
		int zh=dui[++head];
		biao[zh]=0;
		for(int i=hd[zh];i;i=cun[i].nxt){
			int qu=cun[i].xu,quan=cun[i].zhi;
			if(bian[qu]>bian[zh]+quan-da){
				bian[qu]=bian[zh]+quan-da;
				if(!biao[qu]){
					dui[tail++]=qu;
					biao[qu]=1;
					if(++cnt[qu]>n)return 1;
				}
			}
		}
	}
	return 0;
}
inline int read(){
	int date=0,w=1;char c=0;
	while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}
	while(isdigit(c)){date=date*10+c-'0';c=getchar();}
	return date*w;
}
int main(){
	t=read();
	for(int k=1;k<=t;++k){
		memset(hd,0,sizeof(hd));
		memset(cun,0,sizeof(cun));
		ji=0;
		n=read();
		m=read();
		for(int i=1;i<=m;++i){
			int x=read(),y=read(),z=read();
			add(x,y,z);
		}
		double l=-100000000,r=100000000;
		while(r-l>1e-5){
			int bb=0;
			double mid=(l+r)/2;
			memset(cnt,0,sizeof(cnt));
			for(int i=1;i<=n;++i)
				bian[i]=99999999;
			for(int i=1;i<=n;++i)
				if(!cnt[i])
					if(spfa(mid,i)){
						r=mid;
						bb=1;
						break;
					}
			if(bb==0)l=mid;
		}
		if(r<100000000)printf("Case #%d: %.2lf\n",k,l);
		else printf("Case #%d: No cycle found.\n",k);
	}
	return 0;
}

有没有大佬修一下啊

2020/10/22 20:24
加载中...