The 37th ACM/ICPC Asia Regional ChengDu Site Online Contest - B Control

     赤裸裸的最小割...


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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值