hdu 1532Drainage Ditches

网络流!

 

1. E_K()

#include <iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
using namespace std;int g[205][205];
int n,m;
queue<int> q;
int parent[205];
int vis[205];
int flow[205];int min(int a,int b)
{return a>b?b:a;
}int bfs()
{while(!q.empty()) q.pop();for(int i=0;i<=m;i++)flow[i]=vis[i]=0;flow[1]=100000000;q.push(1);vis[1]=1;while(!q.empty()){int cur=q.front();q.pop();if(cur==m)return flow[cur];for(int i=2;i<=m;i++)if(!vis[i]&&g[cur][i]){vis[i]=1;q.push(i);parent[i]=cur;flow[i]=min(flow[cur],g[cur][i]);}}return 0;
}int E_K()
{int all=0,add=0;parent[1]=0;while((add=bfs())){all+=add;int now=m,pre;while((pre=parent[now])){g[pre][now]-=add;g[now][pre]+=add;now=pre;}}return all;
}int main()
{
//    freopen("in.txt","r",stdin);while(scanf("%d %d",&n,&m)==2){for(int i=0;i<=m;i++)for(int j=0;j<=m;j++)g[i][j]=0;for(int i=0;i<n;i++){int s,e,c;scanf("%d %d %d",&s,&e,&c);g[s][e]+=c;}int t=0;printf("%d\n",E_K());}return 0;
}

 

 

2. Dinic()

#include <iostream>
#include<queue>
#include<cstring>
#include<cstdlib>
using namespace std;int g[205][205];
int n,m;
int layer[205];
queue<int> q;int min(int a,int b)
{return a>b?b:a;
}int bfs()
{for(int i=0;i<=m;i++)layer[i]=-1;while(!q.empty()) q.pop();q.push(1);layer[1]=0;while(!q.empty()){int cur=q.front();q.pop();if(cur==m)return 1;for(int i=2;i<=m;i++)if(layer[i]==-1&&g[cur][i]){layer[i]=layer[cur]+1;q.push(i);}}return 0;
}int dfs(int cur,int flow)
{if(cur==m) return flow;for(int i=2;i<=m;i++)if((layer[i]==layer[cur]+1)&&g[cur][i]){int t=dfs(i,min(flow,g[cur][i]));if(t){g[cur][i]-=t;g[i][cur]+=t;return t;}}return 0;
}int dinic()
{int all=0,t;while(bfs())while(t=dfs(1,100000000))all+=t;return all;
}int main()
{
//    freopen("in.txt","r",stdin);while(scanf("%d %d",&n,&m)==2){for(int i=0;i<=m;i++)for(int j=0;j<=m;j++)g[i][j]=0;for(int i=0;i<n;i++){int s,e,c;scanf("%d %d %d",&s,&e,&c);g[s][e]+=c;}int t=dinic();printf("%d\n",t);}return 0;
}