转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23992205

网络流/二分图大合集

【NO.1*原题】

1433: [ZJOI2009]假期的宿舍

Time Limit: 10 Sec  Memory Limit: 162 MB

Submit: 972  Solved: 422

[Submit][Status]

Description

Input

Output

Sample Input

1

3

1 1 0

0 1 0

0 1 1

1 0 0

1 0 0

Sample Output

ˆ ˆ

HINT

对于30% 的数据满足1 ≤ n ≤ 12。

对于100% 的数据满足1 ≤ n ≤ 50,1 ≤ T ≤ 20。

【NO.1*分析】想了非常长时间。igzhou大神非要我用二分图写,但我就是要转化成网络流。首先我们把住校的人(也就是有床的人)的床和汇点T连边。注意这是”床“。而不是人本身。

然后把源点S和全部人连一条边。

再把互相认识的人中人和床连边。

比方1是住校的,2是走读的。2认识1,就把2和1的床连边。

注意不是2和1连边。

自然,对于住校生。自己和自己的床也要连边。

以上全部边的容量都是1。

坑点:输出不用回车。

【NO.1*代码】

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 305
#define INF 2000000000
using namespace std;
int map[N][N],f[N],q[N],num[N],x,test,ans,n,m,i,j,cnt;
bool bfs()
{
memset(f,-1,sizeof(f));
int h=0,t=1;q[1]=0;f[0]=1;
while (h<t)
{
int now=q[++h];if (now==n) return 1;
for (int i=0;i<=n;i++)
if (map[now][i]&&f[i]==-1)
{
f[i]=f[now]+1;q[++t]=i;
}
}
return 0;
}
int dinic(int sta,int sum)
{
if (sta==n) return sum;
int os=sum;
for (int i=0;(i<=n)&&os;i++)
if (map[sta][i]&&f[i]==f[sta]+1)
{
int Min=dinic(i,min(map[sta][i],os));
map[sta][i]-=Min;map[i][sta]+=Min;os-=Min;
}
if (os==sum) f[sta]=-1;
return sum-os;
}
int main()
{
scanf("%d",&test);
while (test)
{
test--;memset(map,0,sizeof(map));
scanf("%d",&n);cnt=0;
for (i=1;i<=n;i++)
{
scanf("%d",&num[i]);
if (num[i]) map[i+n][2*n+1]=1;
}
for (i=1;i<=n;i++)
{
scanf("%d",&x);
if (!num[i]||num[i]&&!x) map[0][i]=1,cnt++;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
scanf("%d",&x);
if (x||i==j) map[i][j+n]=1;
}
n=2*n+1;ans=0;
while (bfs()) ans+=dinic(0,INF);
if (ans==cnt) puts("^_^");else puts("T_T");
}
return 0;
}

【NO.2*原题】

1934: [Shoi2007]Vote 善意的投票

Time Limit: 1 Sec  Memory Limit: 64 MB

Submit: 897  Solved: 537

[Submit][

id=1934" style="color:blue; text-decoration:none">Status]

Description

幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说。这个问题并非非常重要。于是他们决定发扬谦让精神。尽管每一个人都有自己的主见,可是为了照应一下自己朋友的想法,他们也能够投和自己本来意愿相反的票。

我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和全部和自己本来意愿发生冲突的人数。 我们的问题就是,每位小朋友应该如何投票,才干使冲突数最小?

Input

第一行仅仅有两个整数n,m,保证有2≤n≤300,1≤m≤n(n-1)/2。当中n代表总人数。m代表好朋友的对数。文件第二行有n个整数,第i个整数代表第i个小朋友的意愿,当它为1时表示允许睡觉,当它为0时表示反对睡觉。

接下来文件还有m行,每行有两个整数i,j。

表示i,j是一对好朋友,我们保证不论什么两对i,j不会反复。

Output

仅仅须要输出一个整数,就可以能的最小冲突数。

Sample Input

3 3

1 0 0

1 2

1 3

3 2

Sample Output

1

HINT

在第一个样例中,全部小朋友都投赞成票就能得到最优解

Source

【NO.2*分析】我感觉这个的建图有点诡异。把全部1的小朋友和S连,否则和T连。再朋友间互相连。求最大流。

【NO.2*代码】

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 302
#define INF 2000000000
using namespace std;
int map[N][N],f[N],q[N],num,x,y,ans,n,m,i;
bool bfs()
{
memset(f,-1,sizeof(f));
int h=0,t=1;q[1]=0;f[0]=1;
while (h<t)
{
int now=q[++h];if (now==n) return 1;
for (int i=0;i<=n;i++)
if (map[now][i]&&f[i]==-1)
{
f[i]=f[now]+1;
q[++t]=i;
}
}
return 0;
}
int dinic(int sta,int sum)
{
if (sta==n) return sum;int os=sum;
for (int i=0;(i<=n)&&os;i++)
if (map[sta][i]&&f[i]==f[sta]+1)
{
int Min=dinic(i,min(map[sta][i],os));
map[sta][i]-=Min;map[i][sta]+=Min;os-=Min;
}
if (os==sum) f[sta]=-1;return sum-os;
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&num);if (num) map[0][i]=1;else map[i][n+1]=1;
}
for (i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);map[x][y]=map[y][x]=1;
}
n++;while (bfs()) ans+=dinic(0,INF);
printf("%d",ans);
return 0;
}

【NO.3*原题】

1854: [Scoi2010]游戏

Time Limit: 5 Sec  Memory Limit: 162 MB

Submit: 1954  Solved: 689

[Submit][

id=1854" style="color:blue; text-decoration:none">Status]

Description

lxhgww近期迷上了一款游戏。在游戏里。他拥有非常多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时。他仅仅能使用该装备的某一个属性。而且每种装备最多仅仅能使用一次。 游戏进行到最后。lxhgww遇到了终极boss,这个终极boss非常奇怪。攻击他的装备所使用的属性值必须从1開始连续递增地攻击,才干对boss产生伤害。

也就是说一開始的时候,lxhgww仅仅能使用某个属性值为1的装备攻击boss,然后仅仅能使用某个属性值为2的装备攻击boss,然后仅仅能使用某个属性值为3的装备攻击boss……以此类推。
如今lxhgww想知道他最多能连续攻击boss多少次?

Input

输入的第一行是一个整数N,表示lxhgww拥有N种装备 接下来N行,是对这N种装备的描写叙述,每行2个数字,表示第i种装备的2个属性值

Output

输出一行。包含1个数字,表示lxhgww最多能连续攻击的次数。

Sample Input

3

1 2

3 2

4 5

Sample Output

2

HINT

【数据范围】

对于30%的数据。保证N < =1000

对于100%的数据,保证N < =1000000

Source

【NO.3*分析】这个构图是挺经典的。最后我是用二分图A的。

事实上这也挺好理解。左側是各种属性,右側是各种装备。对于每个装备,连两个属性。

这样就能保证选了一个后,对于同一个装备的还有一个属性,就不会选了。

【NO.3*代码】

#include<cstdio>
#include<cstring>
using namespace std;
struct arr{int go,next;}a[2000005];
int belong[1000005],end[10005];
int visit[1000005];
int x,y,n,i,cnt;
char ch;
void add(int x,int y)
{
a[++cnt].go=y;a[cnt].next=end[x];end[x]=cnt;
}
inline int Read()
{
while (ch<'0'||ch>'9') ch=getchar();
int s=0;while (ch>='0'&&ch<='9') s=s*10+ch-48,ch=getchar();return s;
}
bool find(int k)
{
for (int i=end[k];i;i=a[i].next)
{
int go=a[i].go;
if (visit[go]==i) continue;
visit[go]=i;
if (!belong[go]||find(belong[go]))
{
belong[go]=k;
return true;
}
}
return false;
}
int main()
{
scanf("%d",&n);ch=' ';
for (i=1;i<=n;i++)
{
x=Read();y=Read();
add(x,i);add(y,i);
}
memset(belong,0,sizeof(belong));
for (i=1;i<=10000;i++)
if (!find(i)) break;
i--;printf("%d",i);/
return 0;
}

网络流合集:bzoj1433,1934,1854 题解的更多相关文章

  1. 【合集】有标号的DAG图计数(合集)

    [合集]有标号的DAG图计数(合集) orz 1tst [题解]有标号的DAG计数1 [题解]有标号的DAG计数2 [题解]有标号的DAG计数3 [题解]有标号的DAG计数4

  2. [题解+总结]动态规划大合集II

    1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...

  3. [题解+总结]NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  4. 9.15 DP合集水表

    9.15 DP合集水表 显然难了一些啊. 凸多边形的三角剖分 瞄了一眼题解. 和蛤蛤的烦恼一样,裸的区间dp. 设f[i][j]表示i~j的点三角剖分最小代价. 显然\(f[i][i+1]=0,f[i ...

  5. DP+贪心水题合集_C++

    本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本次是最后一篇免费的考试题解,以后的考试题目以及题解将会以付费的方式阅读,题目质量可以拿本次作为参考 本来半个月前就已经搞得差不多了,然后 ...

  6. 动态规划大合集II

    1.前言 大合集总共14道题,出自江哥之手(这就没什么好戏了),做得让人花枝乱颤.虽说大部分是NOIP难度,也有简单的几道题目,但是还是做的很辛苦,有几道题几乎没思路,下面一道道边看边分析一下. 2. ...

  7. NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  8. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  9. 【Android】开发中个人遇到和使用过的值得分享的资源合集

    Android-Classical-OpenSource Android开发中 个人遇到和使用过的值得分享的资源合集 Trinea的OpenProject 强烈推荐的Android 开源项目分类汇总, ...

随机推荐

  1. 【视频】 Linux高级程序设计01.2开发平台及Linux环境限制

    [课程笔记] Linux环境限制 遵循规范,使用现有资源,明确系统限制,增量开发. (1)规范问题 编码的规范,让程序更易读.Linux编码规范. “见着如意”:变量,函数命名等能够让人看到名称就知道 ...

  2. springMVC初探视图解析器——ResourceBundleViewResolver

    视图解析器ResourceBundleViewResolver是根据proterties文件来找对应的视图来解析”逻辑视图“的, 该properties文件默认是放在classpath路径下的view ...

  3. Android学Jni/Ndk 开发记录(一)

      治疗拖延症的唯一办法就是:一想起些什么 / 要做些什么就 TM 立马去做! 是的,突然想起我不会 JNI.NDK 开发.解决办法:立马去学! 一:配置 NDK 环境 下载 NDK 写入到配置文件 ...

  4. leetcode题解:Valid Parentheses(栈的应用-括号匹配)

    题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...

  5. awk使用记录

    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...

  6. Loadrunner 工作原理图

    1.LoadRunner的总体架构图,从图中可以看出组件VUGen, Controller和Analysis之间的关系. 2.LoadRunner的工作原理,从图中可以看出如何利用LoadRunner ...

  7. mac os x+paralles使用source insight

    将Mac OS X下的目录共享到Paralles后,source insight创建工程.但是当再次打开时却打开失败.提示:there was an error opening project 网上对 ...

  8. webstrom 很卡 底下一直走进度条 scanning files to index

    最近工作总会遇到一些问题 先说说webstrom 其中有一次仅仅开了两个项目 电脑风扇就各种轰鸣 各种重启 安装卸载webstrom 都没有作用 好吧 其实解决很简单 选择一个文件夹,右键, Mark ...

  9. Solidworks 好的测试题模拟题

    题目:按照下图构建草图,注意设置必要的几何约束. 问题:   1.参照下图所示参数时请问其中绿色区域的面积为多少平方毫米?     题目:参照下图绘制草图轮廓,注意图中各线条之间均为相切过渡. 问题: ...

  10. h5+ 管理设备信息

    Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 1.属性 1.1.imei: 设备的国际移动设备身份码, ...