BZOJ 1000 A+B Problem
2016-07-05 15:51
190 查看
Description
输入两个数字,输出它们之和
【题目分析】
虽然这是一道水题,但是暗藏玄机。网络流才是正解,8ms迅速出解。其解法之快,令人感叹!!!!
【代码】
输入两个数字,输出它们之和
【题目分析】
虽然这是一道水题,但是暗藏玄机。网络流才是正解,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; }
相关文章推荐
- BZOJ3275 Number (最小割)
- BZOJ2809——[Apio2012]dispatching
- BZOJ2809——[Apio2012]dispatching
- [bzoj1003] [ZJOI2006]物流运输trans
- [bzoj1500][NOI2005]维修数列
- [bzoj1208] [HNOI2004]宠物收养所
- [bzoj1269][AHOI2006]文本编辑器editort
- [bzoj1503][NOI2004]郁闷的出纳员
- bzoj4305 数学
- bzoj3926 广义后缀自动机
- bzoj2780 广义后缀自动机+parent树+Dfs序+树状数组
- BZOJ1997 2-sat
- bzoj4027 贪心
- [BZOJ2038][2009国家集训队][莫队][分块]小z的袜子
- [BZOJ2594][WC2006][LCT][MST]水管局长数据加强版
- [BZOJ2300][HAOI2011][动态凸包]防线修建
- [BZOJ1045][HAOI2008][贪心]糖果传递
- [BZOJ2539][CTSC2000][KM]丘比特的烦恼
- [BZOJ1004][HNOI2008][Burnside引理][DP]Cards
- [BZOJ1202][HNOI2005][并查集]狡猾的商人