网络流模板( 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++;}