随笔分类 -  搜索

poj 3352 Road Construction
摘要:http://poj.org/problem?id=3352题意:给一个无向图,加上最少的边,使得改造后的图中去掉任意一条边后图依然连通。思路:容易想到有环,则环上的点之间不会有问题,所以先首进行缩点,然后形成一棵树,记叶子数为N。再不断进行加边成环缩点可知最终结果为(N+1)/2。N=1时要特判。View Code #include<set>#include<map>#include<stack>#include<queue>#include<cmath>#include<bitset>#include<strin 阅读全文

posted @ 2012-07-04 22:22 aigoruan 阅读(110) 评论(0) 推荐(0)

poj 3177 Redundant Paths
摘要:http://poj.org/problem?id=3177题意:给一个无向图,问至少增加多少边,使得图中的每两个点都有两条不同的路径(两条路径不能有相同的边)。思路:很明显,在环中的点都是满足条件的。所以首先是要进行缩点,记这时的叶子数为N,然后不断的加边成环缩点就会发现最后的结果就是(N+1)/ 2.注意处理重边和N=1的情况。View Code #include<set>#include<map>#include<stack>#include<queue>#include<cmath>#include<bitset> 阅读全文

posted @ 2012-07-04 21:56 aigoruan 阅读(146) 评论(0) 推荐(0)

poj 3160 Father Christmas flymouse
摘要:http://poj.org/problem?id=3160题意:给出一个有向图,每个点有一个点权,点权可能是正也可能为负,一个人从某点出发,沿着一些路,访问结点,或者仅仅是路过这个结点,而不去访问,最后求他能访问到的最大的点权和。思路:在有向图里,经过一个点,可以访问,也可以不访问,所以可以把环上的值都取完,其它的能达到就取。因此先进行缩点聚值,然后dfs+记忆化求最大值。View Code #include<set>#include<map>#include<stack>#include<queue>#include<cmath> 阅读全文

posted @ 2012-07-04 11:16 aigoruan 阅读(176) 评论(0) 推荐(0)

poj 2375 Cow Ski Area
摘要:http://poj.org/problem?id=2375题目大意:FR为自己的牛建立了一个H*W的矩形溜冰场,每一个小方格都有一个高度L,牛只能向相邻的小方格滑动(即上下左右),而且相邻的小方格的高度不能比当前高度高。为了使牛能够从任意一点到达任意其他的点。FR打算买一些ski lifts。它能够连接两个小方格,使得这两个小方格能够相互到达(与高度无关)。问至少需要多少ski lifts。使得牛能够从任意一点到达任意其他的点。解题思路:将此矩阵看成一个图。如果一个小方格能过到达相邻的一个小方格。那么它们之间就相当于有一条边。然后对此图求强连通分量。ans = Max(入度为0的连通分量数目 阅读全文

posted @ 2012-07-04 09:46 aigoruan 阅读(220) 评论(0) 推荐(0)

poj 2553 The Bottom of a Graph
摘要:http://poj.org/problem?id=2553题意:给一个无向图,如果一个点v能够到达w并且w也能到v则w和v都称为一个sink,题目要求从大到小输出图中所有的sink点。注意叶子结点都是sink点。思路:正如上面说的叶子结点都是sink,而且只有叶子结点才能形成sink点。因而先进行缩点,然后再求叶子结点。View Code #include<set>#include<map>#include<stack>#include<queue>#include<cmath>#include<bitset>#incl 阅读全文

posted @ 2012-07-03 21:51 aigoruan 阅读(114) 评论(0) 推荐(0)

poj 1523 SPF
摘要:http://poj.org/problem?id=1523题目大意:给定一个图,求这个图的割点,以及把该割点去掉以后的图有多少过连通分量。思路:先求出所有的割点,然后暴力枚举这些割点求连通分量(1000个点)。View Code #include<set>#include<map>#include<stack>#include<queue>#include<cmath>#include<bitset>#include<string>#include<climits>#include<cstd 阅读全文

posted @ 2012-07-03 20:39 aigoruan 阅读(148) 评论(0) 推荐(0)

hdu 3394 Railway
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3394题意:给定一个有N个点,M条边的无向图,求有多少条边没有在环内,有多少条边在至少2个环内。思路:画一下图,很容易就想到在一个双连通图里,如果边数>点数,则此双连通图里的边都是在2个环内的。其实是错的,下面数据就是这样的特例:6 61 21 32 33 43 54 5其中3为割点。主要就是处理这种数据,在tarjan中,u是v的父亲,从v回溯到u,如果low[v]>dfn[u],则说明v到u没有环,如果low[v]==dfn[u],则说明u到v有环;这两种情况都要处理。View Code #i 阅读全文

posted @ 2012-07-03 17:01 aigoruan 阅读(192) 评论(0) 推荐(0)

hdu 3639 Hawk-and-Chicken
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3639题意:给一个无向图,求出拥有最多祖父的节点。思路:先tarjan缩点,可以知道只能出现在叶子节点,所以反向建图,对每个入度为0的节点进行遍历统计。View Code #include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<bitset>#include<stack>#include<utility>using nam 阅读全文

posted @ 2012-07-03 10:20 aigoruan 阅读(157) 评论(0) 推荐(0)

poj 3180 The Cow Prom
摘要:http://poj.org/problem?id=3180题意:给一个无向图,求出节点数据大于1的边通分量有多少个。思路:直接tarjan缩点统计。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<stack>#include<iostream>#include<utility>using namespace std;const int maxn = 10005;struct nd{ int v,next;}edge[maxn* 阅读全文

posted @ 2012-06-28 13:41 aigoruan 阅读(174) 评论(0) 推荐(0)

poj 3114 Countries in War
摘要:http://poj.org/problem?id=3114题目大意:战争期间的通信问题,同一个国家的城市间可以互相通信,距离可视为零,不同国家的城市间根据所给路径,求解最短路.思路:对于有向图中的环,先进行缩点重建图,然后对每个点直接spfa。注意:重建图后不一定是棵树,所以不能用lca。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<stack>#include<iostream>#include<utility>using 阅读全文

posted @ 2012-06-28 13:13 aigoruan 阅读(141) 评论(0) 推荐(0)

poj 2186 Popular Cows
摘要:http://poj.org/problem?id=2186题意:若A认为B好,且B又认为C好,则可以推出A认为C好,现给一个这样的无向关系图,求出有多少个点,所有人都认为它好。思路:先对图进行tarjan去环缩边成点,并统计环中点的个数,然后查看一下出度为0的点是否为1,如果是则这个点代表的环里的点的数目,否则puts("0");View Code #include<stdio.h>#include<string.h>#include<iostream>#include<stack>#include<utility&g 阅读全文

posted @ 2012-06-27 21:18 aigoruan 阅读(133) 评论(0) 推荐(0)

poj 1236 Network of Schools
摘要:http://poj.org/problem?id=1236题意:1.要求出至少发分配多少站点,使所有点都能收到,即求入度为0的分量。 2.求要添加多少点,使任意一个点发送物品,其他点都能收到物品,即求Max(入度为0的分量个数,出度为0的分量个数)。注意单点的情况.View Code #include<string.h>#include<stdio.h>#include<iostream>#include<stack>#include<utility>using namespace std;const int maxn = 105; 阅读全文

posted @ 2012-06-27 19:53 aigoruan 阅读(123) 评论(0) 推荐(0)

poj 2762
摘要:http://poj.org/problem?id=2762题意:给一个无向图,问对任意的两个点x,y,是否都存在一条路径从一个点出发到达另一个点。思路:先用tarjan对无向图进行缩边和求弱连通分量,如果弱连通分量不为1,则No;然后重建无向图,判断是否是线树,是则Yes,否则No。注意:缩边后的图不一定是棵标准的树。View Code #include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<stack>#include<u 阅读全文

posted @ 2012-06-27 19:09 aigoruan 阅读(137) 评论(0) 推荐(0)

ACM的第六乐章--后缀数组
摘要:以下题目属于入门级别hdu 1403 ural 1517 简单后缀数组应用http://acm.hdu.edu.cn/showproblem.php?pid=1403http://acm.timus.ru/problem.aspx?space=1&num=1517http://poj.org/problem?id=2774题意:给两串字符,求最长的公共子串。思路:把两个串合成一个串,之间用‘#’隔开,然后对后缀排序,求出height数组值后,当height[k]为两个串的公共前缀长度时,取最大的。hdu 3518http://acm.hdu.edu.cn/showproblem.php 阅读全文

posted @ 2012-06-21 10:01 aigoruan 阅读(458) 评论(0) 推荐(0)

ACM的第七乐章--Tarjan lca
摘要:tarjan 求解lca主要利用并差集的想法:首先遍历树,从叶子节点开始向上合并成一棵棵的子树,然后子树并子树,就成了一棵树了。查找是在合并的时候进行的,exp:u是s,t的lca,先从u节点进入s,把s并到u下面,然后发现t没有被访问,退到u,再进入t,同样把t并到u下面,发现s被访问过了,那么s的lca也就是s,t的lca了,也就是并差集里的f[s]。当然,f[s]会变的:假设当前f[s] = u; f[u] = u; 当u并到v的时候,也就是f[u]=v; 相应的f[s] = v。这也就是tarjan求解lca的关键方法。poj 1330 tarjan lcahttp://poj.org 阅读全文

posted @ 2012-06-21 09:49 aigoruan 阅读(611) 评论(0) 推荐(0)

ACM的第二乐章--BFS
摘要:bfs和dfs一样,也是以树形搜索形状进行的,只不过dfs是以树根开始一个个的搜索,而bfs则以步数、层次展开搜索,也就是从树根一层层的向外拓展。这种拓展需要的空间一般都是指数级的,所以不能像dfs一样灵活搜索,往往都是在一定的剪枝策略下展开的,因而bfs一般适合求解最优解。标志性的bfs里会有一个队列,队列里的状态是理解bfs过程的关键,一般来说,队列里存储的是等待拓展的状态,这些等待拓展的状态是很难知道先后关系的,但是队列里的层次、步数的状态肯定是从队头到队尾递增的,往往我们求解的就是这些递增的状态。Catch That Cowhttp://poj.org/problem?id=3278重 阅读全文

posted @ 2012-06-21 09:36 aigoruan 阅读(189) 评论(0) 推荐(0)

hdu 4005
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4005思路:缩点之后形成一棵树,连任意两个点都能之后形成一个环,那么破坏这个环上的任意一个边都不会破坏图的连通性,我们只有破坏不在环上的边才能使图不连通。由于边是任意加的,我们当然要使最小的边尽量都在环里面。好了,这样的话我们可以先找一条最小边,因为如果最小边不在环里的话,那么破坏一个最小边就可以了。找到最小边了之后,以最小边的两个端点分别向两侧遍历一条路径,使得路径上的边的值都尽量小,也就是说使不在路径上的边的值的最小值尽量大,怎么做到呢?稍微想一下,在遍历的时候,对于每个点,他与各个儿子边的次小值(儿子边 阅读全文

posted @ 2012-06-20 21:22 aigoruan 阅读(368) 评论(0) 推荐(0)

hdu 3072 Intelligence System
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3072题意:在一个有向图中,有多个连通分量,每个连通 分量都会有一个根节点,求当满足每个根节点都可以到其它根节点时的最小权值。环中的间的权值都为0.思路:因为有环,而已环中的权值为0,所以要进行缩点,缩点后重建图,所得到的图将没有环。然后枚举每个根节点,进行记忆化搜索就好了。View Code #include<stdio.h>#include<string.h>#include<iostream>#include<stack>#include<utili 阅读全文

posted @ 2012-06-19 21:30 aigoruan 阅读(172) 评论(0) 推荐(0)

hdu 1827 Summer Holiday
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1827题目意思:在一棵有向图中,每个点都有一个权值,求有多少个连通分量;在某个连通分量中,求出可以遍历这个连通分量的点,使得这个点的权值最小。思路:如果没有环,则起点就是所要求的点。如果有环且环上的点都能遍历这个边通分量,则选择环上权值最小的点。定义:每次选择的初始点为根。选择没有遍历过的点作为根,进行tarjan遍历,如果一开始就进入了环,则要把整个环都标记到根上,取环上的最小值作为根的权值。如果发现可以到达其它根,则把该根去掉。View Code #include<string.h>#incl 阅读全文

posted @ 2012-06-19 19:44 aigoruan 阅读(380) 评论(0) 推荐(0)

hdu 3594 Cactus
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3594这是一个很好的题目,很巧的利用的low[u]和dfn[u]。如果low[u]!=dfn[u],则说明已经存在环,如果我们访问u点时发现low[u]!=dfn[u],则说明有一条边在两个环上了。View Code #include<stdio.h>#include<string.h>#include<iostream>#include<stack>#include<algorithm>#include<utility>using na 阅读全文

posted @ 2012-06-19 17:35 aigoruan 阅读(226) 评论(2) 推荐(0)

导航