最大流:HDU-4289(CONTROL)

 
 
#include  
#include  
#include  
#define INF 0x7fffffff 
#define MAXV 1000 
#define MAXE 20000 
using namespace std; 
struct edge
{
    int to,c,next;
}e[MAXE<<3]; 
int size,head[MAXV]; 
void addedge(int from,int to,int c
{   
   e[size].to=to;
    e[size].c = c;
    e[size].next=head[from];
    head[from]=size++; 
        e[size].to=from;
    e[size].c=0;
    e[size].next=head[to];
    head[to]=size++; 
} 
int n,m,s,d;
int cost[MAXV];
int dis[MAXV],gap[MAXV],cur[MAXV],pre[MAXV]; 
int SAP_GAP() 
{
   int cur_flow,flow_ans=0,neck,u,tmp,i;
    int start=s*2-1,end=d*2,N=n*2; 
        memset(dis,0,sizeof(dis));memset(gap,0,sizeof(gap));
      memset(pre,-1,sizeof(pre));
       for(i=0;i<=N;i++)
        cur[i]=head[i]; 
    gap[0]=N;
    u=start; 
       while(dis[start]<N)
       {
   if(u==end
            {       cur_flow=INF; 
                   for(i=start;i!=end;i=e[cur[i]].to
                       if(cur_flow>e[cur[i]].c)
                {
                    cur_flow=e[cur[i]].c;
                    neck=i;
                }
 
                   for(i=start;i!=end;i=e[cur[i]].to
                   {        tmp=cur[i]; 
                           e[tmp].c-=cur_flow;
                           e[tmp^1].c+=cur_flow
                   }
                     flow_ans+=cur_flow;
            u=neck;
            } 
            for(i=cur[u];i!=-1;i=e[i].next
                if(e[i].c&&dis[u]==dis[e[i].to]+1)
                break;
            if(i!=-1
            {
  
              cur[u]=i; 
             pre[e[i].to]=u; 
             u=e[i].to
      } 
            else 
            { 
             if(--gap[dis[u]]==0)    break; 
                  cur[u]=head[u]; 
                for(tmp=N,i=head[u];i!=-1;i=e[i].next) 
                      if(e[i].c)
                    tmp=min(tmp,dis[e[i].to]); 
                  dis[u]=tmp+1; 
                  gap[dis[u]]++; 
                if(u!=start)    u=pre[u]; 
            
          } 
        return flow_ans
} 
void init() 
{       int from,to;
    size=0; 
   memset(head,-1,sizeof(head));
  memset(cost,0,sizeof(cost));
         scanf("%d%d",&s,&d); 
          for(int i=1;i<=n;i++) 
          {
    scanf("%d",&cost[i]); 
                addedge(i*2-1,i*2,cost[i]); 
                //addedge(i*2,i*2-1,cost[i]); 
           } 
        for(int i=1;i<=m;i++) 
          {     scanf("%d%d",&from,&to);
                  addedge(from*2,to*2-1,INF); 
                addedge(to*2,from*2-1,INF); 
          }
 } 
int main() 
{

   while(scanf("%d%d",&n,&m)!=EOF
   {
   
            init(); 
            printf("%d\n",SAP_GAP()); 
   }
   return 0
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值