回顾了下网络流~~本题就是赤果果的最大流~~~话说开始写裸的爆搜增广路超时了~~用了dinic才过的~~庆幸过了好几个月了还能马上把最大流写出来~~
Program:
/*
ID: zzyzzy12
LANG: C++
TASK: ditch
*/
#include<iostream>
#include<istream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stack>
#include<map>
#include<algorithm>
#include<queue>
#define oo 2000000000
#define ll long long
#define pi (atan(2)+atan(0.5))*2
using namespace std;
struct node
{
int x,y,c,next;
}line[1001];
int n,m,_link[501],way[501],dep,MaxFlow,x,MinFlow,dis[501];
bool used[501],f;
queue<int> myqueue;
void EK(int p)
{
int k;
if (p==n)
{
MinFlow=oo;
for (k=dep;k>=1;k--)
if (line[way[k]].c<=MinFlow)
{
MinFlow=line[way[k]].c;
x=line[way[k]].x-1;
}
for (k=1;k<=dep;k++)
{
m++;
line[m].x=line[way[k]].y;
line[m].y=line[way[k]].x;
line[m].c=MinFlow;
line[m].next=_link[line[m].x]; _link[line[m].x]=m;
line[way[k]].c-=MinFlow;
}
MaxFlow+=MinFlow;
f=true;
return;
}
used[p]=true;
k=_link[p];
while (k)
{
if (!used[line[k].y] && line[k].c && dis[line[k].y]-dis[line[k].x]==1)
{
way[++dep]=k;
EK(line[k].y);
dep--;
if (x)
if (x!=p) return;
else x=0;
}
k=line[k].next;
}
used[p]=false;
return;
}
void BFS()
{
int i,k,h;
for (i=1;i<=n;i++) dis[i]=oo;
while (!myqueue.empty()) myqueue.pop();
memset(used,false,sizeof(used));
myqueue.push(1); dis[1]=0;
while (!myqueue.empty())
{
h=myqueue.front();
myqueue.pop();
k=_link[h];
while (k)
{
if (line[k].c && dis[line[k].y]>dis[h]+1)
{
dis[line[k].y]=dis[h]+1;
if (!used[line[k].y])
{
used[line[k].y]=true;
myqueue.push(line[k].y);
}
}
k=line[k].next;
}
}
}
int main()
{
freopen("ditch.in","r",stdin);
freopen("ditch.out","w",stdout);
scanf("%d%d",&m,&n);
memset(_link,0,sizeof(_link));
int i,k,h;
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&line[i].x,&line[i].y,&line[i].c);
line[i].next=_link[line[i].x]; _link[line[i].x]=i;
}
MaxFlow=0;
if (n>1)
while (1)
{
BFS();
f=false;
memset(used,false,sizeof(used));
x=0; dep=0;
EK(1);
if (!f) break;
}
printf("%d\n",MaxFlow);
return 0;
}