原题链接
由最大流最小割定理得:最大流 = = =最小割
代码如下:
#include
using namespace std;
const int N=10000+10;
const int M=200000+10;
const int INF=1e9;
int n,m,S,T;
int h[N],ve[M],c[M],ne[M],id;
int d[N],q[N],cur[N];
void add(int x,int y,int z){
ve[id]=y;c[id]=z;ne[id]=h[x];h[x]=id++;
ve[id]=x;c[id]=0;ne[id]=h[y];h[y]=id++;
}
bool bfs(){
int he=0,ta=0;
memset(d,-1,sizeof d);
q[0]=S;d[S]=0;cur[S]=h[S];
while(he<=ta){
int x=q[he++];
for(int i=h[x];~i;i=ne[i]){
int y=ve[i];
if(d[y]==-1&&c[i]){
d[y]=d[x]+1;
cur[y]=h[y];
if(y==T)return true;
q[++ta]=y;
}
}
}
return false;
}
int dfs(int u,int limit){
if(u==T)return limit;
int flow=0;
for(int i=cur[u];~i&&flow
原题链接
二分答案+最小割
代码如下:
#include
using namespace std;
const int N=100+10;
const int M=1000+10;
const int INF=1e9;
const double eps=1e-8;
int n,m,S,T;
int h[N],ve[M],w[M],ne[M],id;
double c[M];
int q[N],d[N],cur[N];
void add(int x,int y,int z){
ve[id]=y;w[id]=z;ne[id]=h[x];h[x]=id++;
ve[id]=x;w[id]=z;ne[id]=h[y];h[y]=id++;
}
bool bfs(){
int he=0,ta=0;
memset(d,-1,sizeof d);
q[0]=S;d[S]=0;cur[S]=h[S];
while(he<=ta){
int x=q[he++];
for(int i=h[x];~i;i=ne[i]){
int y=ve[i];
if(d[y]==-1&&c[i]>0){
d[y]=d[x]+1;
cur[y]=h[y];
if(y==T)return true;
q[++ta]=y;
}
}
}
return false;
}
double dfs(int u,double limit){
if(u==T)return limit;
double flow=0;
for(int i=cur[u];~i&&flow0){
double t=dfs(y,min(c[i],limit-flow));
if(teps){
double mid=(l+r)/2;
if(dinic(mid)<0)r=mid;
else l=mid;
}
printf("%.2lf",r);
return 0;
}
原题链接
位运算+最小割
代码如下:
#include
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pairPII;
const int N=500+10;
const int M=10000+10;
const int INF=1e9;
int n,m,k,S,T;
int h[N],ve[M],c[M],ne[M],id;
int q[N],d[N],cur[N];
int p[N];//编号
PII edges[M];
void add(int a,int b,int c1,int c2){
ve[id]=b;c[id]=c1;ne[id]=h[a];h[a]=id++;
ve[id]=a;c[id]=c2;ne[id]=h[b];h[b]=id++;
}
void build(int k){
memset(h,-1,sizeof h);
id=0;
for(int i=0;i=0){
if(p[i]>>k&1)add(i,T,INF,0);
else add(S,i,INF,0);
}
}
bool bfs(){
int he=0,ta=0;
memset(d,-1,sizeof d);
q[0]=S;d[S]=0;cur[S]=h[S];
while(he<=ta){
int x=q[he++];
for(int i=h[x];~i;i=ne[i]){
int y=ve[i];
if(d[y]==-1&&c[i]){
d[y]=d[x]+1;
cur[y]=h[y];
if(y==T)return true;
q[++ta]=y;
}
}
}
return false;
}
int dfs(int u,int limit){
if(u==T)return limit;
int flow=0;
for(int i=cur[u];~i&&flow