网络流模板( int型及double型 )
来源:互联网 发布:c语言软件开发 编辑:程序博客网 时间:2024/06/05 17:41
//int型#define N 100#define M 100#define INF 1e8struct{ int to,next; int c;}edge[M];int head[N],level[N],ip;int que[N];bool makelevel(int s,int t){ memset(level,0,sizeof(level)); int iq=0; que[iq++]=s; level[s]=1; int top; for(int i=0;i<iq;i++) { top=que[i]; if(top==t) return 1; for(int k=head[top];k!=-1;k=edge[k].next) { if(!level[edge[k].to]&&edge[k].c>0) { que[iq++]=edge[k].to; level[edge[k].to]=level[top]+1; } } } return 0;}int dfs(int now,int maxf,int t){ if(now==t) return maxf; int ret=0,c; for(int k=head[now];k!=-1;k=edge[k].next) { if(edge[k].c>0&&level[edge[k].to]==(level[now]+1)) { c=dfs(edge[k].to,min(maxf-ret,edge[k].c),t); edge[k].c-=c; edge[k^1].c+=c; ret+=c; if(ret==maxf) return ret; } } --level[now]; return ret;}int dinic(int s,int t){ int ans=0; while(makelevel(s,t)) ans+=dfs(s,INF,t); return ans;}void add(int u,int v,int c,int f)//有向边f为0 ,否则为 c{ edge[ip].to=v;edge[ip].c=c;edge[ip].next=head[u];head[u]=ip++; edge[ip].to=u;edge[ip].c=f;edge[ip].next=head[v];head[v]=ip++;}
//double型#define eps 1e-5#define N 100#define M 100#define INF 1e8struct{ int to,next; double c;}edge[M];int head[N],level[N],ip;int que[N];bool makelevel(int s,int t){ memset(level,0,sizeof(level)); int iq=0; que[iq++]=s; level[s]=1; int top; for(int i=0;i<iq;i++) { top=que[i]; if(top==t) return 1; for(int k=head[top];k!=-1;k=edge[k].next) { if(!level[edge[k].to]&&edge[k].c>eps) { que[iq++]=edge[k].to; level[edge[k].to]=level[top]+1; } } } return 0;}double dfs(int now,double maxf,int t){ if(now==t) return maxf; double ret=0,c; for(int k=head[now];k!=-1;k=edge[k].next) { if(edge[k].c>eps&&level[edge[k].to]==(level[now]+1)) { c=dfs(edge[k].to,min(maxf-ret,edge[k].c),t); edge[k].c-=c; edge[k^1].c+=c; ret+=c; if(fabs(ret-maxf)<eps) return ret; } } --level[now]; return ret;}double dinic(int s,int t){ double ans=0; while(makelevel(s,t)) ans+=dfs(s,INF,t); return ans;}void add(int u,int v,double c,double f) //有向边f为0 ,否则为 c{ edge[ip].to=v;edge[ip].c=c;edge[ip].next=head[u];head[u]=ip++; edge[ip].to=u;edge[ip].c=f;edge[ip].next=head[v];head[v]=ip++;}