08 2012 档案

摘要:题意:一个圆,圆的边上按顺时针放着n个点。现在要连m条边,比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接。给你的信息中,每个点最多只会连接的一条边。问能不能连接这m条边,使这些边都不相交。思路:把每条边都抽象成一个点a,再把a点拆成两个点(2-SAT嘛),分别为a0和a1,分别表示这条边从内部连何从外部连,说到这里应该会建图了吧!再提示一下,对于有可能交叉的两条边考虑连边。怎么判断有可能交叉大家都会吧,细心点就是了!View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstr 阅读全文
posted @ 2012-08-31 23:37 proverbs 阅读(235) 评论(0) 推荐(0)
摘要:题目大意:一个有向图有N个点,M条边。现在要求删掉最少的点,使得不存在从1号点到N号点的长度<=K的路径(不能直接删掉1号点或N号点)。求最少删除多少点。PS:边是有向的思路:费用流+拆点(话说dfs貌似也能过,毕竟点那么少)把每个点拆成两个点,a1和a2,中间连一条容量为1,费用为0的边(注意起点和终点的处理)对于每一条数据中的有向边a-->b,连一条a2-->b1的容量为INF,费用为1的边剩下的就是跑费用流啦~当最短路大于K停止PS:这个算法是错的,请看这组数据10 11 51 2 2 33 44 55 102 91 66 77 88 99 10图:正解应该是迭代加深搜 阅读全文
posted @ 2012-08-30 20:36 proverbs 阅读(646) 评论(0) 推荐(0)
摘要:题意:给出n个数和m组数对应的位运算,断定n个数是否满足m组位运算很久以前就听说2-SAT了,只是最近才花时间看了一下,觉得这个东西真是神奇。对于2-SAT只能把1个点拆成2个点,对于K-SAT问题,貌似是NP问题。。我也不太清楚,反正如果你拆成2个以上的点,那就不要用2-SAT解了。前言:我只是谈一下我的体会,没有证明一定正确,但也许能启发你的思路。2-SAT主要就是处理“矛盾”与“必然”的一种方法,其算法是应用了强连通a1表示a取1,a0表示a取0,b0,b1同理对于矛盾:举例说明 如果a AND b=1,如果我们取a0,这样肯定是无解的,那我们就连一条a0-->a1的边,表示取a0 阅读全文
posted @ 2012-08-30 18:04 proverbs 阅读(264) 评论(0) 推荐(0)
摘要:题目大意:题意是 DuoDuo 想看n部电影,但是被要求最长能看的总时间数为 L ,每部电影有他的时长和DuoDuo对他的评价值 两个属性。 但是 商店有个奇怪的要求 一次只卖恰好 m 个电影碟 (m<=n) 在总时间内,为了获得最大的观赏总价值,要求得该总价值。这个方程很好些吧。dp[i][j][k]表示前i个碟选了j个碟用了k的时间所获得的最大观赏价值空间复杂度和时间复杂度都是N*M*L达到了10000000,空间复杂度可以用滚动数组降维,时间复杂度,10组的case如果都是极限数据可定tle还好HDU比较仁慈,三维就可以过~View Code 1 #include <cstd 阅读全文
posted @ 2012-08-29 22:41 proverbs 阅读(202) 评论(0) 推荐(0)
摘要:题意:给你n个幻灯片,每个幻灯片有个数字编号1~n,现在给每个幻灯片用A~Z进行编号,那么问有多少个幻灯片的数字和字母是唯一对应的二分图的完全匹配的必须边,裸的。这道题目可以用http://www.cnblogs.com/proverbs/archive/2012/08/29/2662638.html方法来解。。但是我的第一反应就是删边。于是乎,用删边的方法做的先做一遍匹配,匈牙利。然后对于匹配中的每条边都删除一遍,如果不能达到完全匹配,则这条边是必须边。大致思想就是这样了代码里几个我犯错的地方写了注释View Code 1 #include <cstdio> 2 #include 阅读全文
posted @ 2012-08-29 22:05 proverbs 阅读(558) 评论(0) 推荐(0)
摘要:题意描述:有n个王子和n个美女,每个王子有自己喜欢的美女,保证每个王子都能娶到一个自己喜欢的美女,现在巫师给出了一个王子和美女匹配的方案,但是国王想知道每个王子能够娶到的美女的名单(保证每个王子都能娶到美女)思路:一看就是二分图,求所有可行的完全匹配的边集,但是想想二分图里面没有可以直接或者间接套用的算法。不知道大家看到数据提供的一组匹配时是什么感想,应该要猜测到这组数据肯定有用。那么假设现在我们按照数据提供的匹配已经匹配好了,这是对于u王子,如果他和v美女(非原配)匹配的话,到最后,则必然要有另一个王子和u的原配美女匹配想想,发现这是一个环,想到强连通了么??先别看以下的内容,先思考再看!构 阅读全文
posted @ 2012-08-29 20:38 proverbs 阅读(436) 评论(0) 推荐(0)
摘要:以前写过这个题,因为还就不写tarjan了,用这道题熟悉一下。题目大意: 给定一个n (n<=100)个点的有向图,问: Q1、最少需要选择多少个点,使得从这些点出发能遍历完整个图; Q2、最少需要添加多少条有向边,使得整个图成为连通图;分析:开始Q1我想复杂了,先说Q2吧,和hdu2767一样,当时我自己ac了hdu2767,可是做Q2的时候又一下没想到,便找出了原来的代码……先由Tarjan算法求出强连通分量后进行缩点,得到每个强连通分量的入度in[],出度out[]; Q1: 入度为0的强连通分量个数; Q2: max( 入度为0的强连通分量个数 , 出度为0的强连通分量个数... 阅读全文
posted @ 2012-08-29 18:41 proverbs 阅读(1151) 评论(0) 推荐(0)
摘要:准确说应该是无向图的欧拉回路应该满足的条件是每个点的度是偶数这个提要求输出字典序最小的方案,为什么SPJ呢??因为题目允许我们从任意一个点开始走,我们只要输出从任意一点出发的欧拉回路方案即可~是一道欧拉回路模板题~View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 #define M 20000 6 #define N 100 7 using namespace std; 8 int map[N][M],st 阅读全文
posted @ 2012-08-29 18:04 proverbs 阅读(207) 评论(0) 推荐(0)
摘要:POJ 1780和HDU 2894基本一样这两道题做法完全相同,唯一的区别就是HDU 2894是一个环(其实也不算区别。。)方法就是:对于每一个长度为n的串,让该串的前n-1位为一个节点,后n-1位为另一个节点这样就确定了这个串。PS:POJ 1780递归会爆栈的,只好写手工站,第一次写,一开始写的超麻烦,后来借鉴别人的了。。还是蒟蒻。。View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #define M 1001000 5 using namespace st 阅读全文
posted @ 2012-08-29 17:18 proverbs 阅读(393) 评论(0) 推荐(1)
摘要:因为要求每个单词只是用一次,还要构成串,很容易想到欧拉路。把单词抽象成一条边,首字母和末字母为边的两个端点,判断有向图欧拉路就行了PS:注意判断连通性,判断连通性构图需要是双向的View Code 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 using namespace std; 5 int in[30],out[30],sum,num,n,tt,st,len; 6 bool map[30][30],vis[30]; 7 char ls[10000]; 8 void dfs 阅读全文
posted @ 2012-08-29 13:06 proverbs 阅读(206) 评论(0) 推荐(0)
摘要:考试的时候这道题没想出来,考完了在LCX的提示下想出来了。呵呵树状数组。那怎么把这颗树拍平呢(转换成1维数组)?其实很简单(当然是想到了才简单),从root开始dfs下去记录第一次访问u点时的时间戳为st[u](下标),当访问完以u为根的所有子树以后要向上回溯的时候,在记录一个时间戳end[u](下标),这样,一棵树的所有顶点权值的和就是st[u]到end[u]的区间和,操作就和普通的树状数组一样了~PS:注意读入,我这个蒟蒻把读入写错了,本机测试没事,上评测机就不行了,不知道为什么。。。View Code 1 #include <cstdio> 2 #include <cs 阅读全文
posted @ 2012-08-29 11:40 proverbs 阅读(225) 评论(0) 推荐(0)
摘要:这是一道综合的好题!题目大意:把n个人分成2各组,每一个人有他所认识的人。所分的组有四点要求:1、每个人都必需属于一个组。2、每个组至少有一个人。3、每个组里面的每个人必需互相认识。4、两个组的成员应尽量接近。首先分析这道题目,题目给出的是一个有向图,即如果有A认识B,但不一定有B认识A。但是在所分配的组里面,任意两个人都要互相认识。1、先读入数据建立有向图,然后对这个有向图进行处理,如果两个点之间的边是单向边,就认为两个点之间无边(因为这两个人不互相认识),对于两个点间的双向边,即建立一条无向边(这两个人互相认识),这样就可以把一个有向图转化为一个无向图。2、将这个无向图转化为它的反图。即有 阅读全文
posted @ 2012-08-28 23:16 proverbs 阅读(369) 评论(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 阅读(155) 评论(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 阅读(1688) 评论(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 阅读(172) 评论(0) 推荐(0)
摘要:昨天刚学网络流,于是拿这道题练手。这道题最关键的就是建边,首先,对于这个题,限制流量是重点,我这里就提供限制流量的方法:拆点!(我作图水平极差,大家凑合着看吧!)我们把每个格子拆成两个点,这连个点之间连一条容量为1,权值为map[i][j]的边再连一条容量为INF,权值为0的边这样就限制了流量,也就是取这个格子最多只能取一次,至于以后再经过这个格子,只能通过第二条容量为INF的边,这样就取不到这个格子的数了为了叙述方便我们设每个格子的第一个点为1,第二个点为2对于一个格子的2号点,连边如上图。从2号点连出来的边意味着通过这个格子以后可以向下边的格子和左边的格子走最后对于左上角和右下角的点分别和 阅读全文
posted @ 2012-08-27 21:18 proverbs 阅读(803) 评论(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 阅读(470) 评论(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 阅读(444) 评论(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 阅读(351) 评论(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 阅读(1272) 评论(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 阅读(859) 评论(1) 推荐(0)
摘要:内存优化版(100分):View Code 1 #include <cstdio> 2 #include <cstdlib> 3 using namespace std; 4 const int N=19; 5 __int64 dp[1<<N][N],ans;int n,m,st; 6 bool map[N][N],mp[N]; 7 void read() 8 { 9 scanf("%d%d",&n,&m);10 for(int i=1,a,b;i<=m;i++)11 {12 scanf("%d%d&quo 阅读全文
posted @ 2012-08-20 11:20 proverbs 阅读(300) 评论(0) 推荐(0)