摘要: 这是一道综合的好题!题目大意:把n个人分成2各组,每一个人有他所认识的人。所分的组有四点要求:1、每个人都必需属于一个组。2、每个组至少有一个人。3、每个组里面的每个人必需互相认识。4、两个组的成员应尽量接近。首先分析这道题目,题目给出的是一个有向图,即如果有A认识B,但不一定有B认识A。但是在所分配的组里面,任意两个人都要互相认识。1、先读入数据建立有向图,然后对这个有向图进行处理,如果两个点之间的边是单向边,就认为两个点之间无边(因为这两个人不互相认识),对于两个点间的双向边,即建立一条无向边(这两个人互相认识),这样就可以把一个有向图转化为一个无向图。2、将这个无向图转化为它的反图。即有 阅读全文
posted @ 2012-08-28 23:16 proverbs 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 这个题,就不用说什么了吧,最裸的最小点覆盖。View Code 1 #include <cstdlib> 2 #include <cstdio> 3 #include <cstring> 4 #define M 1000000 5 using namespace std; 6 int head[M],next[M],to[M],linky[M],m,bk,n,cnt; 7 bool vis[M]; 8 inline void add(int u,int v) 9 {10 to[cnt]=v; next[cnt]=head[u]; head[u]=cnt++; 阅读全文
posted @ 2012-08-28 23:04 proverbs 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 此题:平面图最大流用的不是网络流算法,但是需要网络流的结论:最小割=最大流【问题描述】YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域。简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形。从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口。下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路。小Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的 阅读全文
posted @ 2012-08-28 15:36 proverbs 阅读(1650) 评论(0) 推荐(0) 编辑
摘要: 这道题应该都能想到朴素的有n*m+个点的建图方案吧,呵呵,显然是不行的。那么怎么办?其实我们可以这样想:一个人能买到的猪有两个来源:①来自自己第一次打开的猪圈②来自之前别人打开的猪圈想到了这个实质,见图就简单了!我们设一个超级源点S,和超级汇点T,对于每一个人,从S向他连一条容量为K的边(K是由这个人第一次打开的猪圈的初始猪的个数之和),然后对于一个人A,他打开了P猪圈,且P猪圈之前被B打开过,则从B向A连一条容量为INF的边,最后,对于每一个人,都向T连一条容量为lim[i](表示每个人的购买猪的上限)的边,跑在最大流就行!代码:View Code 1 #include <cstdio 阅读全文
posted @ 2012-08-27 22:43 proverbs 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 昨天刚学网络流,于是拿这道题练手。这道题最关键的就是建边,首先,对于这个题,限制流量是重点,我这里就提供限制流量的方法:拆点!(我作图水平极差,大家凑合着看吧!)我们把每个格子拆成两个点,这连个点之间连一条容量为1,权值为map[i][j]的边再连一条容量为INF,权值为0的边这样就限制了流量,也就是取这个格子最多只能取一次,至于以后再经过这个格子,只能通过第二条容量为INF的边,这样就取不到这个格子的数了为了叙述方便我们设每个格子的第一个点为1,第二个点为2对于一个格子的2号点,连边如上图。从2号点连出来的边意味着通过这个格子以后可以向下边的格子和左边的格子走最后对于左上角和右下角的点分别和 阅读全文
posted @ 2012-08-27 21:18 proverbs 阅读(797) 评论(0) 推荐(0) 编辑
摘要: 题意简述:比较好理解,给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致。man每移动一格需花费$1(即单位费用=单位距离),一间house只能入住一个man。现在要求所有的man都入住house,求最小费用。(题意转自:http://blog.csdn.net/lyy289065406/article/details/6732762)思路:嗯,这个见图可以说没什么难度吧,明摆着怎么建图么。。需要注意的是,KM求的是最大权匹配,而题木要求是最小,这个好处理,把边的权值全部取相反数,然后做KM,最后把ans取相反数即可View Code 1 #include. 阅读全文
posted @ 2012-08-26 23:36 proverbs 阅读(463) 评论(0) 推荐(0) 编辑
摘要: 大致题意:有N个木桩,和M个木桩对之间的高度差(从x跳到y需要往上跳的高度)。从x跳跃到y的路径消耗的体力值是路径中的一个最大高度差。求一条消耗体力最小的路径。思路:-和POJ 1797类似,只是这道题的没有固定起点和终点,而是在询问中给出,询问还特别多,这个不用想,肯定要预处理出来答案的第一次floyd处理的是连通性,map[i][j]此时的含义是从i到j的最短路径长度第二次floyd处理的是两点间路径的最小的最大值,嗯,就是这样View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstr 阅读全文
posted @ 2012-08-26 21:22 proverbs 阅读(433) 评论(0) 推荐(0) 编辑
摘要: 题目大意:求1到n的可行路径上最小值的最大值,也就是说从1到n的每一条可行路径上都有一条最小值,有多条路径的话就求这些最小值的最大值。思路:spfa的变种,将spfa中的dis[i]改为me[i], 代表从1到i的路径中最小边的最大值,提示到这里了,怎么更新就不在罗嗦了,有疑问就看代码吧!View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 #define N 1010 6 #define M 1001000 阅读全文
posted @ 2012-08-26 21:12 proverbs 阅读(341) 评论(0) 推荐(0) 编辑
摘要: 这个题暴搜10分钟写出来了,也AC了。但听XLK和LYD神牛讲的欧拉回路的方法,真心跪了!XLK题解(有改动):很显然,第一问的答案就是2^n。第二问,构造一个有2^(n-1)个节点的图,对应2^(n-1)个n-1位二进制数。从代表数k的节点(0<=k<2^(n-1))向代表数(k<<1)&(1<<n-1)的节点,和代表数(k<<1)&(1<<n-1)+1的节点分别连一条边。可以发现这样的图中,所有点的入度和出度都是2,因此这是一个欧拉图。因此我们从0号点开始dfs寻找一个欧拉回路,回溯的时候记录到栈中,最后倒序输出即 阅读全文
posted @ 2012-08-21 23:11 proverbs 阅读(1252) 评论(0) 推荐(0) 编辑
摘要: 【官方题解】第一届『Citric杯』NOIP提高组模拟赛 题解第一题 柠檬超市这题是本次模拟赛的送分题。做法显然。但是注意此题有一个陷阱:注意W和C的规模都是10^9,所以如果直接用double来存储性价比会挂精度(999999999/1000000000和999999998/999999999的差距只有10^-18,这么微小的差距double是分辨不出来的)正确做法是,把除法的除数移项,转化成乘法,然后用int64或long long。另外一个讨巧的方法是用long double或extended来存储性价比,因为long double/extended的有效数字比double更多,所以勉强 阅读全文
posted @ 2012-08-21 13:19 proverbs 阅读(819) 评论(1) 推荐(0) 编辑