求助,样例过不去
查看原帖
求助,样例过不去
257206
Herio楼主2020/12/22 18:30
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=1e4+5,mod=1e9+7;
const ll inf=1e15;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int n,m,cnt=1,h[N],st,ed,dep[N],cur[N];
struct edge{
	int to,nt;double w;
}e[M],e1[M];
void add(int u,int v,double w){
	e1[++cnt]={v,h[u],w},h[u]=cnt;
	e1[++cnt]={u,h[v],0},h[v]=cnt;
}
bool bfs(){
	queue<int>q;q.push(st),mst(dep,0),dep[st]=1;
	while(!q.empty()){
		int  u=q.front();q.pop();cur[u]=h[u];
		for(int i=h[u];i;i=e[i].nt){
			int v=e[i].to;
			double w=e[i].w;
			if(w>0&&!dep[v]) dep[v]=dep[u]+1,q.push(v);
		}
	}return dep[ed];
}
double dfs(int u,double c){
	if(u==ed) return c;double res=c;
	for(int &i=cur[u];i;i=e[i].nt){
		int v=e[i].to;
		double w=e[i].w;
		if(w>1e-5&&dep[v]==dep[u]+1){
			double now=dfs(v,min(res,w));
			if(!now) dep[v]=1;
			else e[i].w-=now,e[i^1].w+=now,res-=now;
		}if(res<1e-5) return c;
	} return c-res;
}
double sap(){
	double s=0;while(bfs()) s+=dfs(st,1e15); 
	return s;
}
int main(){
	double p;
	scanf("%d%d%lf",&n,&m,&p);
	double l=0,r=0;
	for(int i=1,u,v;i<=m;i++){
	double w; 
		scanf("%d%d%lf",&u,&v,&w),add(u,v,w),r=max(r,w);
	}for(int i=2;i<=cnt;i++) e[i]=e1[i];
	double mc=0;st=1,ed=n;
	mc=sap();printf("%.0f\n",mc);
	while(r-l>1e-4){
		double mid=(l+r)/2;
		for(int i=2;i<=cnt;i+=2){
			e[i].w=e1[i].w<mid?e1[i].w:mid;
			e[i+1].w=0;
		}
		double tmp=sap();
	//	printf("%lf %lf\n",l,r);
		if(fabs(mc-tmp)>1e-5) l=mid;
		else r=mid;
	}printf("%.10f\n",l*p);
	return 0;
}

是不是dinic 写假了,为啥更新边权后,二分得不对了。

2020/12/22 18:30
加载中...