BZOJ 1000 A+B Problem

Description
  输入两个数字,输出它们之和
  


【题目分析】
虽然这是一道水题,但是暗藏玄机。网络流才是正解,8ms迅速出解。其解法之快,令人感叹!!!!


【代码】

#include <cstdio>
#include <iostream>
#include <cstring>
#define INF 1000000
using namespace std;
int u[501],v[501],h[501],ne[501],map[501],f[501];
int n,m,en=0,S,T;
void add(int a,int b,int r)
{
    u[en]=a;v[en]=b;ne[en]=h[a];f[en]=r;h[a]=en++;
    u[en]=b;v[en]=a;ne[en]=h[b];f[en]=0;h[b]=en++;
}
bool tell()
{
    memset(map,-1,sizeof map);
    int que[501];
    int head=0,tail=0;
    que[tail++]=S;
    map[S]=0;
    while (head<tail){
        int u=que[head++];
        for (int i=h[u];i!=-1;i=ne[i]){
            if (map[v[i]]==-1&&f[i]){
                map[v[i]]=map[u]+1;
                que[tail++]=v[i];
            }
        }
    }
    if (map[T]!=-1) return true;
    else return false;
}
int zeng (int k,int now)
{
    if (k==T) return now;
    int r=0;
    for (int i=h[k];i!=-1&&now>r;i=ne[i]){
        if (map[k]+1==map[v[i]]&&f[i]!=0){
            int t=zeng(v[i],min(now-r,f[i]));
            f[i]-=t;f[i^1]+=t;r+=t;
        }
    }
    if (!r) map[k]=-1;
    return r;
}
int dinic()
{
    int r=0,t;
    while (tell()) while (t=zeng(S,INF)) r+=t;
    return r; 
}
int main()
{
    memset(h,-1,sizeof h);
    S=0;T=2;
    int a,b;
    scanf("%d%d",&a,&b);
    add(S,1,a),add(S,1,b),add(1,T,a),add(1,T,b);
    cout<<dinic()<<endl;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值