萌新袜子求助QAQ
查看原帖
萌新袜子求助QAQ
238408
vectorwyxSD省选加油楼主2022/1/10 19:39

RT,这题我二分上界设 1e8,eps 设 1e-9 就会 WA,把上界改成 1e6 反而过了。请问这是为什么啊?/yun

//author:望远星
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sml(x,y) (x=min(x,y))
#define big(x,y) (x=max(x,y))
#define ll long long
#define ull unsigned long long
#define db double
#define fo(i,x,y) for(int i=x;i<=y;++i)
#define go(i,x,y) for(int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,fh=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-') fh=-1; ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0'; ch=getchar();} return x*fh;}
inline void out(int *a,int l,int r){fo(i,l,r) cout<<*(a+i)<<' ';puts("");}

const int N=1e6+5,inf=1e9;
const db eps=1e-9;
struct Edge{
	int to,next,r;
	db c;
}e[N];
int head[N],tot,n,a[101][101],b[101][101],now[N],ins[N],vis[N],ti,s,t;
db dis[N],cost;

void connect(int x,int y,int r,db c){
	e[++tot]=(Edge){y,head[x],r,c};
	head[x]=tot; 
}

void add(int x,int y,int r,db c){
	connect(x,y,r,c);
	connect(y,x,0,-c);
}

bool spfa(){
	//puts("spfa()");
	fo(i,1,t) dis[i]=inf,ins[i]=0;dis[s]=0;
	queue<int> q;q.push(s);
	while(!q.empty()){
		int x=q.front();q.pop();
		now[x]=head[x];
		ins[x]=0;
		for(int i=head[x];i;i=e[i].next)if(e[i].r){
			int p=e[i].to;
			//printf("awa %d->%d\n",x,p);
			if(dis[p]-(dis[x]+e[i].c)>eps){
				dis[p]=dis[x]+e[i].c;
				if(!ins[p]) q.push(p),ins[p]=1;
			}
		}
	}
	return dis[t]<inf;
}

int dfs(int x,int lim){
	//printf("dfs(%d,%d)\n",x,lim);
	if(x==t) return lim;
	vis[x]=ti;int ret=0;
	for(int i=now[x];i;i=e[i].next,now[x]=i)if(e[i].r){
		int p=e[i].to;//printf("qwq %d->%d\n",i,p);
		if(fabs(dis[p]-(dis[x]+e[i].c))>eps||vis[p]==ti) continue;
		int k=dfs(p,min(lim,e[i].r));
		e[i].r-=k,e[i^1].r+=k;
		cost+=k*e[i].c;
		lim-=k,ret+=k;
		if(!lim) break;
	}
	vis[x]=0;
	return ret;
}

signed main(){
	cin>>n;
	fo(i,1,n) fo(j,1,n) a[i][j]=read();
	fo(i,1,n) fo(j,1,n) b[i][j]=read();
	db l=0.0,r=1e6,ans;s=n<<1|1,t=s+1;
	while(r-l>eps){
		db mid=(l+r)/2;//mid=10.0/2;
		tot=1;fo(i,1,t) head[i]=0;
		fo(i,1,n) fo(j,1,n) add(i,j+n,1,-a[i][j]+mid*b[i][j]);
		fo(i,1,n) add(s,i,1,0);fo(i,1,n) add(i+n,t,1,0);
		cost=0;
		while(spfa()) ++ti,dfs(s,inf);
		if(cost<=0||fabs(cost)<eps) l=mid+eps,ans=mid;
		else r=mid-eps;
	}
	printf("%.6f\n",ans);
	return 0;
}
2022/1/10 19:39
加载中...