hdu-1532

来源:互联网 发布:mac不能无线键盘 编辑:程序博客网 时间:2024/06/10 15:31

求最大流算法dinic 2

#include<stdio.h>   // 最大流 Dinic 模版 2#include<string.h>#include<algorithm>using namespace std;#include<vector>#define INF 0x3f3f3f3f#include<queue>struct node{int to,cap,rev;};vector<node> v[300];int n,m;int level[300];//int iter[1100];void init(){for(int i=0;i<=n;i++)v[i].clear();}void bfs(int s){memset(level,-1,sizeof(level));level[s]=0;queue<int> q;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int i=0;i<v[u].size();i++){node e=v[u][i];if(e.cap>0&&level[e.to]<0){level[e.to]=level[u]+1;q.push(e.to);}}}}int dfs(int x,int t,int f){if(x==t) return f;int s=f; for(int i=0;i<v[x].size();i++){node &e=v[x][i];if(e.cap>0&&level[e.to]==level[x]+1){int k=dfs(e.to,t,min(f,e.cap));if(k>0){e.cap-=k;v[e.to][e.rev].cap+=k;f=f-k;}}}return s-f;}int main(){int i,j,k,t;while(~scanf("%d%d",&m,&n)){init();int star,end,cap;for(i=0;i<m;i++){scanf("%d%d%d",&star,&end,&cap);v[star].push_back((node){end,cap,v[end].size()});v[end].push_back((node){star,0,v[star].size() - 1});}int flow=0;while(1){bfs(1);if(level[n]<0)break;//memset(iter,0,sizeof(iter));//int f;//while((f=dfs(1,n,INF))>0)//flow+=f;flow+=dfs(1,n,INF);}printf("%d\n",flow);}return 0;} 


dinic 算法 1


#include<stdio.h>   // 最大流 Dinic 模版 #include<string.h>#include<algorithm>using namespace std;#include<vector>#define INF 0x3f3f3f3f#include<queue>struct node{int to,cap,rev;};vector<node> v[300];int n,m;int level[300];int iter[1100];void init(){for(int i=0;i<=n;i++)v[i].clear();}void bfs(int s){memset(level,-1,sizeof(level));level[s]=0;queue<int> q;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int i=0;i<v[u].size();i++){node e=v[u][i];if(e.cap>0&&level[e.to]<0){level[e.to]=level[u]+1;q.push(e.to);}}}}int dfs(int x,int t,int f){if(x==t) return f;for(int &i=iter[x];i<v[x].size();i++){node &e=v[x][i];if(e.cap>0&&level[e.to]==level[x]+1){int k=dfs(e.to,t,min(f,e.cap));if(k>0){e.cap-=k;v[e.to][e.rev].cap+=k;return k;}}}return 0;}int main(){int i,j,k,t;while(~scanf("%d%d",&m,&n)){init();int star,end,cap;for(i=0;i<m;i++){scanf("%d%d%d",&star,&end,&cap);v[star].push_back((node){end,cap,v[end].size()});v[end].push_back((node){star,0,v[star].size() - 1});}int flow=0;while(1){bfs(1);if(level[n]<0)break;memset(iter,0,sizeof(iter));int f;while((f=dfs(1,n,INF))>0)flow+=f;}printf("%d\n",flow);}return 0;} 





原创粉丝点击