随笔分类 -  算法--图论

摘要:图的连通性dfn[u]: 表示节点u的搜索优先级low[u]: 表示节点u,通过其本身或其子节点能到达的最小有搜索优先级low[u] = Min{ 1. dfn[u] 其本身搜索优先级 2. Min{ low[v] } 其子节点v能到达的最小优先级 3. Min( dfn[v] ) 其通过回边(u,v),其中v为u的祖先节点,的优先级}一无向图1. 割点又名关键点,若删除该点与其发出的边.则整个图不连通.当前顶点u是一个关键点的充要条件是:1. 若顶点U是根,则其必定包含两个以上的子节点. (因为若只有一个.删除了U之后,图仍然连通)2. 若顶点U不是根,... 阅读全文
posted @ 2013-07-26 13:49 yefeng1627 阅读(1077) 评论(0) 推荐(0)
摘要:题目详解出自 论文 Amber-最小割模型在信息学竞赛中的应用题目大意: 给出一个带权无向图 G = (V,E), 每条边 e属于E都有一个权值We,求一个割边集C,使得该割边集的平均边权最小,即最小化:1. 将等式转换,引入x向量,Xi取值为(0,1),得到0-1分数规划常规式:2. 将其转换得到一个关于的一个函数:3. 其中为单调递减函数, 当且仅当= 0 , 为最优值.然后我们可以二分枚举最优值, 然后判定当前最优值是否符合要求.判定思路: 对于每一条边权Wi 变换成了新的边权, 而向量X(x1,x2,..,xm)表示对应边取或者不取,所以根据其取与不取划分成一个ST集。令取为... 阅读全文
posted @ 2013-07-07 17:30 yefeng1627 阅读(813) 评论(0) 推荐(0)
摘要:构图思路:1. 源点S与顶点v连边,容量为A2. 顶点v与汇点T连边,容量为B3. 边(a,b,c),则顶点a与顶点b连双向边,容量为c则最小花费为该图最小割即最大流。若两个作业分别在不同机器运行,则之间若有边,则必定是满流,否则必定还有增广路。#include#include#include#includeusing namespace std;const int inf = 0x3f3f3f3f;const int MAXN = (int)2e5+10;int n, m;int S, T, N;int head[MAXN], idx;struct Edge{ int v, f, nx... 阅读全文
posted @ 2013-07-07 13:06 yefeng1627 阅读(269) 评论(0) 推荐(0)
摘要:构图思路:1.将所有顶点v拆成两个点, v1,v22.源点S与v1连边,容量为 W-3.v2与汇点连边,容量为 W+4.对图中原边( a, b ), 连边 (a1,b2),容量为正无穷大则该图的最小割(最大流)即为最小花费。简单证明: 根据ST割集的定义,将顶点分成两个点集。所以对于原图中的边(a,b),转换成 S->a1->b2->T. 则此时路径必定存在一条割边,因为a1->b2为无穷大,所以割边必定是 S->a1 or b2->T, 若为前者则意味着删除a顶点的W-,后者则是b顶点的W+.所以该图最小割即为最小花费。计算方案: 对于构图后跑一次最大流, 阅读全文
posted @ 2013-07-07 12:22 yefeng1627 阅读(910) 评论(0) 推荐(0)
摘要:二分枚举租用飞机的最大花费,然后用小于等于最大花费的边构建层次图(依据时间)构图思路: 利用二元组(x,y)表示 x天y城市 1. e天有飞机从a城市飞到b城市,能够承载x人,则添加单向边 ( e, a ) -> ( e+1, b ) 容量为x 2. 每一天的a城市到第二天的a城市连边,容量为正无穷大 3. 每一天的N城市到汇点T连边,容量为正无穷大 4. 源点V与第0天的所有顶点连边,容量为当前城市0天初始人数#include#include#include#include#include#include#includeusing namespace std;const int M.. 阅读全文
posted @ 2013-07-06 21:04 yefeng1627 阅读(474) 评论(0) 推荐(0)
摘要:参考论文:郭华阳《RMQ与LCA问题》 的解法.通过构建最小生成树,然后转换成 寻找最近公共祖先来求解, 逆序处理询问,将删除改成添加边.代码在BZOJ上WA了.暂时未找到原因, 先放着... 不过有看到用splay, 动态树等做的..#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<map>#include<vector>using namespace std;const int N = (int)1e5+10;co 阅读全文
posted @ 2013-05-16 19:49 yefeng1627 阅读(661) 评论(0) 推荐(0)
摘要:题意: N个城市(n<=100), 每个城市是一个矩形的(输入数据给定随机三个顶点),且四个顶点都有飞机场,城市内四个顶点移动单位花费Ti, 不同城市间通行只能坐飞机,单位花费都为m,现在给定起点城市A,和终点城市B. 求最短花费.解法: 首先是已知矩形三个顶点求第四个顶点. 然后拆点. 每个城市四个顶点. 城市间四个顶点只能坐火车,城市内顶点和其他城市顶点坐飞机.然后总共400个顶点.做一次floyd,求出任意双点间最短路,然后枚举A,B的四个顶点.取最小即可. 想法很简单....代码写起来感觉不太好~~~虽然1A...View Code #include<cstdio># 阅读全文
posted @ 2013-05-02 20:43 yefeng1627 阅读(156) 评论(0) 推荐(0)
摘要:虽然题目只给了起点st,和终点ed, st,ed <= 10000.但是只有200条边,极端情况也才200条边对应的400个顶点都不一样.所以我们可以离散化顶点到[1,400]之间.然后跑个最大流即可.注意本题边是单向的.View Code #include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<map>using namespace std;const int inf = 0x3f3f3f3f;const int MAXN = 1 阅读全文
posted @ 2013-04-28 19:08 yefeng1627 阅读(162) 评论(0) 推荐(0)
摘要:解题思路: 首先考虑题目数据大小范围, 总共9个不同数字的全排列, 9! = 3*10^5 假设N = 9!, 意味着,拼图的状态有N种, 将其看成顶点.[1,N] 则因为每次只能够移动0, 且每次只能向四个方向移动,则意味着每个顶点至多有四条边.且每条边的长度为1. 假定序列 (876543210) 目标序列, 其编号为 st, 则我们可以通过求 单源点的最短路. 求出从st出发到其他顶点v的最短距离 dis[v]. 那么对于T次询问操作. 我们只需要O(1)的时间 输出dis[v]就可以了. 另外还有个问题就是. 对于 (0,1,..,8)的全排列,如何唯一编号.这里就用到... 阅读全文
posted @ 2013-04-28 16:27 yefeng1627 阅读(150) 评论(0) 推荐(0)
摘要:题意: N个顶点(N<=10000),N-1条边,每条边含有一个权值,有T个基地,需要删除K条边,形成K+1个连通块,使每个连通块包含至少一个基地. 求最小花费.解法: 还是太弱. 看完题没敢想 O(N^2)的算法,最初想建模求最小割,后面又想到点分治,但是O(N^2)的空间复杂度。。。。。 其实题目给了10S, 将所有边从小到大排序后, 尝试删除该边,若此边两端 联通快,都包含基地,则删除. 处理出来K+1个联通块就是答案了.View Code #include<cstdio>#include<cstdlib>#include<cstring>#in 阅读全文
posted @ 2013-04-22 20:02 yefeng1627 阅读(155) 评论(0) 推荐(0)
摘要:题目 给N个name ,与N个id, 及其之间关系, 求唯一匹配解法 删除边(u,v)后若匹配数减小,则证明此边必定为唯一匹配。 时间复杂度有点高。View Code #include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<string>#include<map>#include<iostream>using namespace std; map<string,int> mp_name,mp_id;c 阅读全文
posted @ 2013-04-04 12:55 yefeng1627 阅读(306) 评论(0) 推荐(0)
摘要:对于路径覆盖概念请点击以下链接: Path Cover#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 150;int n, m;int ma[N],mb[N];bool g[N][N], vis[N];int path( int u ){ for(int v = 1; v <= n; v++){ if( g[u][v] && !vis[v] ){ vis[v] = 1; if( ma[v] == -1 || path( ma[v] )){ ... 阅读全文
posted @ 2013-04-03 19:41 yefeng1627 阅读(199) 评论(0) 推荐(0)
摘要:题意 N个人,其中包含男女,然后某些男女之间有关系。现要求找出最大的K人,其之间两两无关系。解题思路 最大独立子集问题。 题意是求最大独立集,但是N太大(其实也不大,就是数据好强,KB算法T了), 因为男女生有边,男男或者女女之间不会有边,所以理论上将男女分开,然后就形成二分图了. 但是,男女情况不明....我是将N个看成一个集合,与其自身匹配. 拆点将N个人看成 集合A{N},与集合B{N},然后求最大匹配, 结果即为最大独立集 : N - 最大匹配/2#include<stdio.h>#include<stdlib.h>#include<string.h> 阅读全文
posted @ 2013-04-02 19:41 yefeng1627 阅读(565) 评论(0) 推荐(0)
摘要:题意 P个课程,N个学生,之间有边连接,问是否可以 P个学生选择不同的P个课程。解题思路 最大匹配#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 310;int p, n;bool g[110][310];int ma[N], mb[N];bool vis[N];int path( int u ){ for(int v = 1; v <= n; v++){ if( g[u][v] && !vis[v] ){ vis[v] = 1; if( m... 阅读全文
posted @ 2013-04-02 17:13 yefeng1627 阅读(182) 评论(0) 推荐(0)
摘要:题意 两个机器A,B, 分别有 N,M个工作模式, K个作业,可以在( Ai, Bj ) 模式下工作. 机器最初在模式0下.问最小的 切换模式次数.解题思路 A, B 两个天然二分图顶点集合, A,B机器上的两个模式之间连边即为 作业K. 最小的切换次数, 即为 最小顶点覆盖数. 特殊的定理是, 二分图中 最小顶点覆盖 = 最大匹配. (仅仅在二分图中满足. 主要是由于最大独立点集导致)#include<stdio.h>#include<string.h>#include<stdlib.h>const int N = 110;int n, m, k;int 阅读全文
posted @ 2013-04-02 16:56 yefeng1627 阅读(190) 评论(0) 推荐(0)
摘要:题意, N*N 矩阵, 有些地方有行星, 现有一种武器能够攻击一行, 或者一列,问最少攻击次数.消灭所有行星解法. 因为要消灭所有顶点, 同一行中的顶点能 一次 消灭, 同一列的顶点也能 一次 消灭. 我们需要 最小的 攻击次数, 则意味着 最小的攻击次数消灭 所有顶点. 将所有存在行星的顶点(x,y), 按x, y轴分别作为 A,B顶点集合,转换成二分图. 这样 A,B集合连边的代表一次 攻击 箭支 能消灭的行星, 则题目所求就转换成了. 最小的顶点 覆盖所有边, 既 最小顶点覆盖 问题. 又因为, ( 在所有图中都满足) 最小顶点覆盖 + 最大独立子集 = 顶点数... 阅读全文
posted @ 2013-04-02 16:50 yefeng1627 阅读(213) 评论(0) 推荐(0)
摘要:题意 N*M矩阵,有空地('o')、草地('*')、墙('#‘),机器人能攻击到上下左右,不被墙挡住的方位。并且机器人只能被放置在空地上。问能放置的最大数量机器人,相互间不能攻击到。解题思路 对于所有空地,能够攻击到的相互之间冲突,即可连接成边,然后题目就转换成了 最大独立集问题。但是本题 顶点数量为 50*50 = 2500, 果断TLE。 另外我们可以发现,通过 将每一行相互攻击到的空格位置看成一个点,这些点命名为 {A} 将每一列相互攻击到的空格位置看成一个点,这些点命名为 {B} 则图就转换了二分图, 对于 顶点集 {A} 与 {B} 而言, 之 阅读全文
posted @ 2013-04-01 20:47 yefeng1627 阅读(277) 评论(0) 推荐(0)
摘要:题意 n*m的矩阵中,某些地区需要放置雷达,而雷达覆盖有四种方式,上下左右,问最少的雷达数量覆盖所有*号地区。解法 关于二分图的性质,有点晕头转向了。 和旭神讨论了。 这个题目是满足二分图的。因为对于一个雷达其关联的地方分别为上下左右,不能够斜线。则与雷达A关联的其它雷达间是不会有联系的。所以不会形成环。可以转换成2个集合间的关联关系。所以我们可以通过拆点法求出最大匹配。而有效顶点数量 = 最大匹配数 + 边覆盖数(最小边覆盖集)。同时也是本题的所求的边覆盖数,既最小雷达数量。View Code #include<cstdio>#include<cstdlib>#inc 阅读全文
posted @ 2013-03-31 16:57 yefeng1627 阅读(274) 评论(0) 推荐(0)
摘要:题意 n*n的矩阵中,有空地和墙,放置机器人能攻击到垂直和水平地方(有墙则被隔绝),问最多能放多少机器人,相互之间不攻击解题思路 最大独立集, 对于实际顶点应该是除去墙。 然后贴模板~~ View Code #include<cstdio>#include<cstring>#define N 50bool flag[N], a[N][N];int ans, cnt[N], group[N], n, m, vis[N]; bool dfs( int u, int pos ){ int i, j; for( i = u+1; i <= n; i++){ if( cn. 阅读全文
posted @ 2013-03-31 15:33 yefeng1627 阅读(181) 评论(0) 推荐(0)
摘要:题意 给一个无向图,求其最大团中顶点数量。。。解题思路 跪了。。。这够裸了。。。 最大团模板。。View Code #include<cstdio>#include<cstring>#define N 51bool flag[N], a[N][N];int ans, cnt[N], group[N], n, m, vis[N]; bool dfs( int u, int pos ){ int i, j; for( i = u+1; i <= n; i++){ if( cnt[i]+pos <= ans ) return 0; if( a[u][i]... 阅读全文
posted @ 2013-03-31 14:19 yefeng1627 阅读(351) 评论(0) 推荐(0)

Launch CodeCogs Equation Editor