摘要:
题目大意:题意是 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 阅读全文
摘要:
题意:给你n个幻灯片,每个幻灯片有个数字编号1~n,现在给每个幻灯片用A~Z进行编号,那么问有多少个幻灯片的数字和字母是唯一对应的二分图的完全匹配的必须边,裸的。这道题目可以用http://www.cnblogs.com/proverbs/archive/2012/08/29/2662638.html方法来解。。但是我的第一反应就是删边。于是乎,用删边的方法做的先做一遍匹配,匈牙利。然后对于匹配中的每条边都删除一遍,如果不能达到完全匹配,则这条边是必须边。大致思想就是这样了代码里几个我犯错的地方写了注释View Code 1 #include <cstdio> 2 #include 阅读全文
摘要:
题意描述:有n个王子和n个美女,每个王子有自己喜欢的美女,保证每个王子都能娶到一个自己喜欢的美女,现在巫师给出了一个王子和美女匹配的方案,但是国王想知道每个王子能够娶到的美女的名单(保证每个王子都能娶到美女)思路:一看就是二分图,求所有可行的完全匹配的边集,但是想想二分图里面没有可以直接或者间接套用的算法。不知道大家看到数据提供的一组匹配时是什么感想,应该要猜测到这组数据肯定有用。那么假设现在我们按照数据提供的匹配已经匹配好了,这是对于u王子,如果他和v美女(非原配)匹配的话,到最后,则必然要有另一个王子和u的原配美女匹配想想,发现这是一个环,想到强连通了么??先别看以下的内容,先思考再看!构 阅读全文
摘要:
以前写过这个题,因为还就不写tarjan了,用这道题熟悉一下。题目大意: 给定一个n (n<=100)个点的有向图,问: Q1、最少需要选择多少个点,使得从这些点出发能遍历完整个图; Q2、最少需要添加多少条有向边,使得整个图成为连通图;分析:开始Q1我想复杂了,先说Q2吧,和hdu2767一样,当时我自己ac了hdu2767,可是做Q2的时候又一下没想到,便找出了原来的代码……先由Tarjan算法求出强连通分量后进行缩点,得到每个强连通分量的入度in[],出度out[]; Q1: 入度为0的强连通分量个数; Q2: max( 入度为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 阅读全文
摘要:
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 阅读全文
摘要:
因为要求每个单词只是用一次,还要构成串,很容易想到欧拉路。把单词抽象成一条边,首字母和末字母为边的两个端点,判断有向图欧拉路就行了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 阅读全文
摘要:
考试的时候这道题没想出来,考完了在LCX的提示下想出来了。呵呵树状数组。那怎么把这颗树拍平呢(转换成1维数组)?其实很简单(当然是想到了才简单),从root开始dfs下去记录第一次访问u点时的时间戳为st[u](下标),当访问完以u为根的所有子树以后要向上回溯的时候,在记录一个时间戳end[u](下标),这样,一棵树的所有顶点权值的和就是st[u]到end[u]的区间和,操作就和普通的树状数组一样了~PS:注意读入,我这个蒟蒻把读入写错了,本机测试没事,上评测机就不行了,不知道为什么。。。View Code 1 #include <cstdio> 2 #include <cs 阅读全文