摘要: 题意:求最大环的边数,给出一个无向图,图中每条边的长度都是1,求图中最长环的长度是多少。分析:dfs , 开一个数组pan作访问标记View Code #include <cstdio>#include <cstring>#include <iostream>using namespace std;const int maxn = 5000 , maxm = 500050;int pan[maxn];bool vis[maxn];struct Edge{ int v , next; }edge[maxm];int E , head[maxn];int n , 阅读全文
posted @ 2012-07-03 01:44 lenohoo 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 题意:给出若干个矩形的上下边,如定义的边界,求大于这个边界 且 长和宽递增的最长矩阵序列 并 输出分析:对宽排序 , 对长进行DP 最长上升子序列 处理#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define re(i,n) for(int i=0;i<n;i++)const int maxn = 100100;int dp[maxn];int pre[maxn];struct Pan { int 阅读全文
posted @ 2012-07-02 23:43 lenohoo 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个城市里,分布着若干条地铁线路,每条地铁线路有若干个站点,所有地铁的速度均为40km/h。现在知道了出发地和终点的坐标,以及这些地铁线路每个 站点的坐标,你的步行速度为10km/h,且你到了地铁的任意一个站之后就刚好有地铁出发。问你从出发点到终点最少需要多少时间。分析:按“车能开的地方坐车,车不能开的地方走路”的想法建一个图,结果就是求最短路,因为数据范围很小,所以用floyd算法,没有使用较复杂的单源最短路算法View Code #include <cstdio>#include <cstring>#include <iostream>#incl 阅读全文
posted @ 2012-07-02 13:05 lenohoo 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 题意:有n个城市,m条连接两个城市的道路(双向边),每条道路有自己的最大复载量。现在问从城市a到城市b,车上的最大载重能为多少。即求从a到b的路径中权值最小边的最大值分析:贪心的思想,我们每次找 道路载重量最大的路加入集合中,其思想于最短路思想基本上是一样的,所以用最短路的思想解题,dist值改为路径上最大上限(相当于最大流,这里用最短路来解)View Code #include <cstdio>#include <cstring>#include <iostream>#include <string>#include <map>us 阅读全文
posted @ 2012-07-02 04:41 lenohoo 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一个*n的有向图,其中第i行第j列元素表示i—>j的最短路,求途中最少有几条边?分析: 假设一开始是个完全图,就有n*(n-1)条边,然后考虑的时候再删除重边; 如果出现i—>k +k—>j < i—>j 的情况,因为是最短路所以出错,输出"impossible"; 不然,如果存在 i—>k +k—>j == i—>j , 那么直接的边 i —> j 就可以删去,原图中就少了一个点View Code #include <cstdio>#include <cstring>#include 阅读全文
posted @ 2012-07-02 03:03 lenohoo 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 题意:有k头牛n个农场面条有向边(拓扑有序,不存在环),告诉你所有奶牛的初始位置,求所有奶牛能够到达的公共点。记录每头奶牛能够到达的位子,最后判断一下就可以了。View Code #include <cstdio>#include <cstring>#include <iostream>using namespace std;#define re(i,n) for(int i=0;i<n;i++)#define re1(i,n) for(int i=1;i<=n;i++)const int maxn = 1010 , maxm = 10010;i 阅读全文
posted @ 2012-07-02 02:47 lenohoo 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个n*m的格子里有b个障碍物,每个障碍物都有一个标记表示他的周围(上下左右)必须有且只有几个灯泡,想在让你方灯泡,要求灯泡彼此之间不能被照到,而且每个空白区域一定要被照到,求最少的灯泡数分析:dfs + 剪枝View Code #include <cstdio>#include <cstring>#include <iostream>using namespace std;#define re(i,n) for(int i=0;i<n;i++)#define re1(i,n) for(int i=1;i<=n;i++)#define i 阅读全文
posted @ 2012-07-01 23:27 lenohoo 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 题意:要建一棵圣诞树,使得总的花费最小。具体规则是:圣诞树是一颗无向树形图,其中,编号为1的节点为根节点,原始图中每条边具有边权:材料的单位价值;每个点也有一个权:点的重量。生成树中,各条边的花费是该边权* 该边的子树中所有点的重量和,总的花费则是生成树中所有边的花费之和。题目要求是这样一棵树,每条边的权值是该边和所有子节点的点权和的乘积,那么,将我们的角度从边转移到点,对于每一个点,他所涉及的权值就是他延一条边到达源点1的距离*它本身的权值,对每个点都是如此;所以求出点1到每个点的单源最短路,每个点的距离乘点权和就是答案。View Code #include <cstdio>#i 阅读全文
posted @ 2012-07-01 01:01 lenohoo 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 题意:一些公司共同拥有一个具有n个顶点的网络,给出了有关于这个网络的信息,即边<i,j>以及与这条边相连的公司,现在题目给出一条路径的起点和终点,要求求出这条路径经过哪些公司. 很容易想到求图的传递闭包,而这里两点之间可能有多条线路,之前对每个字母(也就是每个公司)单独来进行一遍Floyd,结果超时了,这里输入的公司标志为不同的小写字母,最多只有26个,所以我们可以根据位运算来进行优化。floyd + 位运算考虑到相邻两条边都被一个公司拥有当且仅当两条边上都有该公司对应的字母,位运算&能有获得两个公司的公共位,新边并上(|)这个结果就表示新边所属的公司View Code #incl 阅读全文
posted @ 2012-06-30 20:57 lenohoo 阅读(207) 评论(0) 推荐(0) 编辑
摘要: dfs题意:已知起点和终点,求石子从起点到达终点的最短路,如果无法到达,则输出-1。石子移动的具体规则如下: 1、开始时,石子在起点s处 2、运动方向可以是水平或垂直的,不能斜方向运动 3、最开始的时候,你可以将石子向上下左右任意一个方向抛,如果与它相邻的点是障碍物的话除外 4、一旦石子开始运动,有三种可能: a、遇到障碍物,石子会停在障碍物的前一格,障碍物会消失 b、如果出界,游戏失败 c、到达终点,游戏结束并成功 5、如果移动的次数超过10次,将认为游戏是失败的把考虑的情况放进去就行了View Code #include <cstdio>#include ... 阅读全文
posted @ 2012-06-30 18:26 lenohoo 阅读(154) 评论(0) 推荐(0) 编辑