B - Drainage Ditches
题意是求1到n的最大流量,EE算法我觉得掌握的还可以,就是有一个后悔的方式,其他和广搜一样
#include <stdio.h>
#include<algorithm>
#include<string.h>
#include <queue>
#define N 205
#define INF 0x7fffffff
#define ll long long
using namespace std;
ll g[N][N],pre[N],dis[N];
ll n,m,s,t,ans;
queue <ll> q;
ll bfs ()
{
for(int i = 1; i <= n; i++)
pre[i]=-1;
while(!q.empty())
q.pop();
q.push(s);
dis[s]=INF;
while (!q.empty())
{
ll x=q.front();
q.pop();
if(x==t) break;
for(int i = 1; i <= n; i++)
{
if(pre[i]==-1&&g[x][i])
{
pre[i]=x;
dis[i]=min(dis[x], g[x][i]);
q.push(i);
}
}
}
if(pre[t] == -1) return -1;
else return dis[t];
}
void EK()
{
ll inc;
while (1)
{
inc = bfs();
if(inc==-1) break;
ll k=t;
while (k != s)
{
g[k][pre[k]]+=inc;
g[pre[k]][k]-=inc;
k=pre[k];
}
ans+=inc;
}
}
int main ()
{
ll u,v,cost;
while(~scanf("%lld%lld",&m,&n))
{
memset(dis,0,sizeof(dis));
memset(g,0,sizeof(g));
ans=0;
s=1,t=n;
for(int i = 1; i <= m; i++)
{
scanf("%lld %lld %lld",&u,&v,&cost);
g[u][v]+=cost;
}
EK();
printf("%lld\n", ans);
}
return 0;
}