图论

DP&图论 DAY 2 下午

给你一囗甜甜゛ 提交于 2019-11-26 10:03:42
DP&图论 DAY 2 下午 基础树形 DP 前言 ◦ 1 :与树或图的生成树相关的动态规划。 ◦ 2 :以每棵子树为子结构,在父亲节点合并,注意树具有天然的子结构。 这是很优美的很利于 dp 的。 ◦ 3 :巧妙利用 Bfs 或 Dfs 序,可以优化问题,或得到好的解决方法。 ◦ 4 :可以与树上的数据结构相结合。 ◦ 5 :树形 Dp 的时间复杂度要认真计算,部分问题可以均摊复杂度分析。 ◦ 6 :一般设 f[u] 表示 u 子树的最优价值或者是说方案数。 ◦ 或者 f[u][k] 表示 u 子树附加信息为 k 的最优值,往往是通过考虑子树根节点 的情况进行转移。 ◦ 7 :树形 dp ,在树结构上,求最优值,求方案等 dp 问题,就可以考虑是树 形 dp 。 ◦ 当然也有可能是点分治或者是分析性质的贪心题。但是树形 dp 绝对是一 个很好的思考方向。 >树上最大独立集 ◦ 给你一棵大小为 n 的树,求这棵树的最大独立集是多少。 ◦ 最大独立集指的是一个最大的点集使得其中的点两两没有边相连。 ◦ N<=100000 >Solution ◦ dp[i][0/1] 表示做完了 i 的子树, i 点是否选的最大独立集,即可直接转移。 对于当前节点 i ,如果不选 i ,那么他的儿子可以选也可以不选 如果选 i ,那么他的儿子一定不能选 ◦ 代码还是很好写的。 >树的直径 ◦

DP&图论 DAY 2 上午

若如初见. 提交于 2019-11-26 10:03:04
DP&图论 DAY 2 上午 背包DP模型 >背包DP ◦ 一般是给出一些“物品 ” ,每个物品具有一些价值参数和花费参数,要求 在满足花费限制下最大化价值或者方案数。 ◦ 最简单几种类型以及模型 ◦ 0/1 背包 ◦ 完全背包 ◦ 多重背包 > 0/1 背包问题 ◦ 给出 n 个物品,每个物品有 Vi 的价值和 Wi 的费用,我们总共有 m 块钱,求 最多能得到多少价值的物品。 ◦ N<=10^3,m<=10^3 >Solution ◦ 设 dp[i][j] 表示前 i 个物品,用了 j 的体积得到的最大的价值。 ◦ 则 dp[i][j]=max{dp[i-1][j] , dp[i-1][j-w[i]]+v[i]} ◦ 复杂度 O(N*M) ◦ 如果要记录方案数呢? ◦ 如果要求输出方案呢? >在有价值情况下求方案数?? 原来的式子是dp[i][j]=max{dp[i-1][j] , dp[i-1][j-w[i]]+v[i]} ,dp[ ][ ] 是最大价值 现在设方案数为 f[ ][ ] 如果dp[i-1][j] > dp[i-1][j-w[i]]+v[i] ,那么就会选择第一种转移过来 如果dp[i-1][j] < dp[i-1][j-w[i]]+v[i] ,那么就会选择第二种转移过来 所以 f[i][j]=max(f[i-1][j],f[i-1][j-wi]} 如果dp[i

数据结构实验之图论四:迷宫探索

心已入冬 提交于 2019-11-26 06:47:36
Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。 Output 若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。 访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。 Sample Input 1 6 8 1 1 2 2 3 3 4 4 5 5 6 6 4 3 6 1 5 Sample Output 1 2 3 4 5 6 5 4 3 2 1 Hint Source xam 解题思路:这道题其实就是对图进行一遍dfs,然后用一个数组来把dfs的顺序来存储起来。 代码如下: #include<stdio.h> #include<string.h> #include<stdlib.h> int map[1011][1011] ; //记录节点之间的关系 int vis