网络流模板:最大流ISAP算法和Dinic算法
来源:互联网 发布:java 数组分割 编辑:程序博客网 时间:2024/06/11 18:39
ISAP:
#include<cstdio>#include<cstring>#include<queue>#include<algorithm>#define N 505#define inf 999999999using namespace std;int n,m,s,t,dis[N],pre[N],gap[N],flow[N][N];struct edge{int v,w;edge *next,*rev;edge(){next=0;}edge(int vv,int ww,edge *e){v=vv;w=ww;next=e;}}*adj[N],*path[N],*e;void insert(int u,int v,int w){edge *p=new edge(v,w,adj[u]);adj[u]=p;edge *q=new edge(u,0,adj[v]);adj[v]=q;p->rev=q;q->rev=p;}void bfs(){memset(dis,0x7f,sizeof(dis));memset(gap,0,sizeof(gap));queue<int> q;dis[t]=0;gap[0]=1;q.push(t);while(q.size()){int x=q.front();q.pop();for(e=adj[x];e;e=e->next){if(e->rev->w==0||dis[e->v]<t)continue;dis[e->v]=dis[x]+1;++gap[dis[e->v]];q.push(e->v);}}}int ISAP(){memset(dis,0,sizeof(dis));memset(gap,0,sizeof(gap));//bfs();int ans=0,u=s,d;while(dis[s]<=t){if(u==t){int minflow=-1u>>1;for(e=path[u];u!=s;e=path[u=pre[u]])minflow=min(minflow,e->w);for(e=path[u=t];u!=s;e=path[u=pre[u]]){e->w-=minflow;e->rev->w+=minflow;flow[pre[u]][u]+=minflow;flow[u][pre[u]]-=minflow;}ans+=minflow;}for(e=adj[u];e;e=e->next)if(e->w>0&&dis[u]==dis[e->v]+1)break;if(e){pre[e->v]=u;path[e->v]=e;u=e->v;}else{if(--gap[dis[u]]==0)break;for(d=t,e=adj[u];e;e=e->next)if(e->w>0)d=min(d,dis[e->v]);dis[u]=d+1;++gap[dis[u]];if(u!=s)u=pre[u];}}return ans;}int main(){int u,v,w;while(~scanf("%d%d",&m,&n)){memset(adj,0,sizeof(adj));while(m--){scanf("%d%d%d",&u,&v,&w);insert(u,v,w);//insert(v,u,w);//无向边}s=1;t=n;printf("%d\n",ISAP());}}/*6 53 4 54 5 51 2 102 3 101 3 202 5 20*/
Dinic:
#include<cstdio>#include<cstring>#include<algorithm>#define N 5005#define M 10005#define inf 999999999using namespace std;int n,m,s,t,num,adj[N],dis[N],q[N];struct edge{int v,w,pre;}e[M];void insert(int u,int v,int w){e[num]=(edge){v,w,adj[u]};adj[u]=num++;e[num]=(edge){u,0,adj[v]};adj[v]=num++;}int bfs(){int i,x,v,tail=0,head=0;memset(dis,0,sizeof(dis));dis[s]=1;q[tail++]=s;while(head<tail){x=q[head++];for(i=adj[x];i!=-1;i=e[i].pre)if(e[i].w&&dis[v=e[i].v]==0){dis[v]=dis[x]+1;if(v==t)return 1;q[tail++]=v;}}return 0;}int dfs(int s,int limit){if(s==t)return limit;int i,v,tmp,cost=0;for(i=adj[s];i!=-1;i=e[i].pre)if(e[i].w&&dis[s]==dis[v=e[i].v]-1){tmp=dfs(v,min(limit-cost,e[i].w));if(tmp>0){e[i].w-=tmp;e[i^1].w+=tmp;cost+=tmp;if(limit==cost)break;}else dis[v]=-1;}return cost;}int Dinic(){int ans=0;while(bfs())ans+=dfs(s,INT_MAX);return ans;}int main (){while(~scanf("%d%d",&m,&n)){int u,v,w;memset(adj,-1,sizeof(adj));num=0;s=1;t=n;while(m--){scanf("%d%d%d",&u,&v,&w);insert(u,v,w);}printf("%d\n",Dinic());}}
- 网络流模板:最大流ISAP算法和Dinic算法
- 网络流模板:最大流ISAP算法和Dinic算法
- 最大流算法,Dinic,ISAP
- : 最大流(Dinic算法 + ISAP算法)
- 最大流模板(Dinic, ISAP)
- 网络流算法总汇(ek,dinic,isap)
- 最大流ISAP算法模板
- 最大流ISAP算法模板
- 网络流模板 Dinic+ISAP
- Dinic算法 P3376 【模板】网络最大流
- 最大网络流模板Dinic算法
- 网络流最大流算法(ISAP算法及DINIC算法)
- isap算法网络最大流
- POJ-3281 : 最大流(Dinic算法 + ISAP算法)
- 最大流Dinic算法讲解 && ISAP 算法解释
- 网络最大流-ISAP算法详解与模板
- 网络最大流-ISAP算法详解与模板
- 最大流 dinic算法模板
- Linux添加内核系统调用报告
- Accelerated C++ 6.1查找URL
- 阶乘求和之最后一位
- Java的字符日期格式转换
- 备忘录:jsp重定向。使用out.print(); response.sendRedirect();
- 网络流模板:最大流ISAP算法和Dinic算法
- OGRE 1.7 鼠标非独占使用(鼠标移出当前窗口)
- scanf和printf函数处理不同进制
- scanf和printf函数处理不同进制
- 嵌入式的笔试/面试经典题目
- 排排坐,吃果果
- Accelerated C++ 7.4 生成句子
- QML之使用C++自定义QML类型(一)
- win32 asm Hello World Demo