赤裸裸的最小割...
Program:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#define oo 1000000000
#define ll long long
using namespace std;
struct node
{
int x,y,c,next;
}line[100005];
int n,m,_link[405],ans,dis[405],num,way[405],Flow[405],S,D;
queue<int> myqueue;
void addline(int x,int y,int c)
{
m++;
line[m].x=x; line[m].y=y; line[m].c=c;
line[m].next=_link[x];
_link[x]=m;
return;
}
bool BFS()
{
int h,i,k;
memset(dis,0,sizeof(dis));
dis[1]=1;
while (!myqueue.empty()) myqueue.pop();
myqueue.push(1);
while (!myqueue.empty())
{
h=myqueue.front();
myqueue.pop();
k=_link[h];
while (k)
{
if (line[k].c && !dis[line[k].y])
{
dis[line[k].y]=dis[h]+1;
myqueue.push(line[k].y);
}
k=line[k].next;
}
}
return dis[n];
}
void DFS(int h)
{
int k;
if (h=n)
{
ans+=Flow[num];
for (h=1;h<=num;h++)
{
line[way[h]].c-=Flow[num];
Flow[h]-=Flow[num];
if (way[h]%2) k=way[h]+1;
else k=way[h]-1;
line[k].c+=Flow[num];
}
return;
}
k=_link[h];
num++;
while (k)
{
if (line[k].c && dis[line[k].y]-dis[h]==1)
{
way[num]=k;
Flow[num]=min(line[k].c,Flow[num-1]);
DFS(line[k].y);
if (!Flow[num-1])
{
num--;
return;
}
}
k=line[k].next;
}
num--;
return;
}
void Dinic()
{
ans=0;
while (BFS())
{
num=0;
Flow[0]=oo;
DFS(1);
}
return;
}
int main()
{
freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);
int i,x,y,z,p,n,f,d;
while (~scanf("%d%d",&n,&f,&d))
{
scanf("%d%d",&S,&D);
memset(_link,0,sizeof(_link));
m=0;
for (i=1;i<=n;i++)
{
scanf("%d",&x);
addline(i*2-1,i*2,x);
addline(i*2,i*2-1,0);
}
while (p--)
{
scanf("%d%d",&x,&y);
addline(x*2,y*2-1,oo);
addline(y*2-1,x*2,0);
addline(y*2,x*2-1,oo);
addline(x*2-1,y*2,0);
}
Dinic();
printf("%d\n",ans);
}
return 0;
}