图论
文章平均质量分 71
leolin_
这个作者很懒,什么都没留下…
展开
-
【最小顶点覆盖】POJ 3041
最小顶点覆盖=最大匹配数,以行为x集合,列为y集合#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespa原创 2012-01-13 21:00:30 · 1067 阅读 · 0 评论 -
【RMQ+LCA】ZOJ 3195
求三点的最短路径和,先求出两两之间的路径和,再除以2就是答案,可以把它看作数轴上的三点,另外,这还可以推广到一般情况由于zoj挂了,暂时放在这里,应该可以过的2月8日更新:wa了一次,原因是预处理dp数组的第二维开小一倍,本来是re才对,结果返回wa,最讨厌这样子...#define N 50010struct edge{ int v; int len;原创 2012-02-08 02:10:08 · 889 阅读 · 0 评论 -
【LCA转RMQ求树上任意两点最短路】HDU 2874
这里有可能不连通,可以通过添加一个虚根把森林变成树,最后如果LCA(u,v) = 0就表示不连通个人比较喜欢用离线算法,tarjan还需要掌握#define N 10010struct edge{ int v; int len; int next;}e[2*N];int ecnt;int head[N];bool vis[N];int n;//点数原创 2012-02-08 15:17:48 · 837 阅读 · 0 评论 -
【LCA+树形DP】POJ 3417
参考了该blog的思路http://www.cppblog.com/Yuan/archive/2010/07/11/120101.html,orz...........#define N 100010struct edge{ int v; int len; int next;}e[2*N];int ecnt;int head[N];bool vis[N];原创 2012-02-08 17:57:59 · 826 阅读 · 0 评论 -
【tarjan双连通+LCA求割边数】POJ 3694
http://poj.org/problem?id=369408年的合肥赛区网络赛,这里求u,v的LCA只是常数时间复杂度#define N 100010struct edge{ int v; int next;}e[N*10];int ecnt;int head[N];void init(){ ecnt = 0; memset(head,-1,s原创 2012-02-09 13:18:10 · 1078 阅读 · 0 评论 -
【RMQ+LCA】POJ 1986
oj的数据可能有点问题,貌似连通与不连通都可以过,保守起见,用并查集判断是否连通,添加虚根弄成一棵树再用离线rmq#define N 40010struct edge{ int v; int len; int next;}e[2*N];int ecnt;int head[N];bool vis[N];int n;//点数int R[N];//第一次出现原创 2012-02-08 03:28:48 · 545 阅读 · 0 评论 -
【tarjan双连通求割点&连通分量】POJ 1523
/*构建一棵dfs树,序列dfn[i]为深度优先数,表示dfs时访问i节点的序号,low[i]表示从i节点出发能访问到的最小的深度优先数。当且仅当节点u满足如下两个条件之一时,u为割点:1.u为dfs树的根,且u至少有两个子节点。2.u不是dfs树的根,至少存在一个节点v是u的子节点,且low[v]>=dfn[u]。若u为割点,记subnets[u]为u的子节点数,则去掉u后,图被分成原创 2012-02-10 01:36:26 · 449 阅读 · 0 评论 -
【无向图求最小割集】
一个无向连通网络,去掉一个边集可以使其变成两个连通分量则这个边集就是割集;最小割集当然就权和最小的割集。可以用最小切割最大流定理:1.min=MAXINT,确定一个源点2.枚举汇点3.计算最大流,并确定当前源汇的最小割集,若比min小更新min4.转到2直到枚举完毕5.min即为所求输出min 不难看出复杂度很高:枚举汇点要O(n),最原创 2012-02-10 21:45:13 · 7242 阅读 · 0 评论 -
【求最小代价环floyd】POJ 1734
#define N 110int g[N][N];int dis[N][N];int ans[N];int p[N][N];//记录i——j之间的路径int n,m;int minm;int cnt;int mid;void floyd(){ int i,j,k; for(k=1;k<=n;k++){ //求环 for(i=1;i<原创 2012-02-10 15:17:17 · 683 阅读 · 0 评论 -
【图染色】ZOJ 2066
很简单,先根据每个人选择情况建一个无向图,然后标记染色,有相邻边的不能染成同种颜色!原来标准时先对度排序,再染色。。。没有排序都可以过,这种算法叫Welch Powell算法,自己加上度的排序吧~用Welch Powell 算法进行图着色的步骤如下:(1)将图G的结点按照度数的递减次序进行排列.(这种排列可能并不是唯一的,因为有些点有相同的度数).(2)用第一种颜色对第一点原创 2011-08-20 22:38:18 · 914 阅读 · 1 评论 -
【LCA模板题】POJ 1330
RMQ版#define N 10010struct edge{ int v; int next;}e[2*N];int ecnt;int head[N];bool vis[N];int n;//点数int R[N];//第一次出现i点下标int p[N*2];//记录路径点编号//int dis[N];//与根的距离int dep[2*N];//深度int原创 2012-02-08 04:31:03 · 1009 阅读 · 1 评论 -
最短路 Dijkstra算法
以下部分转自百度百科Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直原创 2011-05-13 22:06:00 · 777 阅读 · 0 评论 -
【最小割】ustc 1280
http://acm.ustc.edu.cn/ustcoj/problem.php?id=1280这题是中国科大“百分点科技杯"ACM除夕挑战赛 的题目,当时做不出,后来想了一下,TLE1次,wa一次就过了这题去掉最小费用和的边使得最短路变长,方法是先求一次最短路,然后建新图,图中存在的边当且仅当(u,v) dis[u]+w(u,v)=dis[v],题目就变成求切掉最小的边,切完后最短路必原创 2012-01-25 20:19:33 · 652 阅读 · 0 评论 -
【混合图欧拉回路】POJ 1637
混合图的欧拉回路问题。 混合图就是边集中有有向边和无向边同时存在。这时候需要用网络流建模求解。 建模: 把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。 因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路。 好了,现在每个点入度和出度之差均为偶数。那么将这原创 2012-01-15 22:45:50 · 1480 阅读 · 0 评论 -
【树形dp】POJ 1463
dp[k][0]表示以k点为根的子树最小需要的结点数(k不取),同样,dp[k][1]表示以k点为根的子树最小需要的结点数(k取),其中,父结点不取,则儿子结点就必取有转移方程:dp[root][0] = dp[son][1],dp[root][0] = min( dp[son][1],dp[son][0] ) +1,利用dfs回溯进行dp#include #include #in原创 2012-01-14 17:02:31 · 471 阅读 · 0 评论 -
【转】POJ 图论、网络流题目
POJ 2449 Remmarguts' Date(中等)http://acm.pku.edu.cn/JudgeOnline/problem?id=2449题意:经典问题:K短路解法:dijkstra+A*(rec),方法很多相关:http://acm.pku.edu.cn/JudgeOnline/showcontest?contest_id=1144该题亦放在搜索推荐题中转载 2012-01-15 12:11:23 · 981 阅读 · 0 评论 -
【k短路】POJ 2449
首先讲讲A*算法吧。众所周知,A*算法就是启发式搜索,基本形式就是这样:f(x)=g(x)+h(x);其中f(x)代表在x点所需要的总代价,而g(x)代表:从源点到x点已经耗费的实际代价,h(x)代表从x到终点需要的估计代价,这个函数是一个估计值.而从x到终点真正需要的代价为h*(x),在整个启发式搜索中我们必须保证h(x)这样我们可以理解了BFS的搜索过程,BFS的搜索过程中没有考虑到h原创 2012-01-25 01:37:59 · 959 阅读 · 1 评论 -
【2-SAT】POJ 3678
http://poj.org/problem?id=3678【题意】:有n个变量,每个可以取0或者1,再给出m组关系,每组关系都是两个变量进行运算可以得到的结果,运算有AND OR XOR三种,问能否根据这些关系,判断每个变量的取值。【题解】:2-Sat问题,关键是要把所有情况考虑完全。用x表示该变量取0,x’表示取1,下面说下如何构图: a and b原创 2012-01-27 01:25:58 · 634 阅读 · 0 评论 -
【2-SAT+二分】POJ 2749
http://hi.baidu.com/%8E%E1%D0%B3/blog/item/3f5354fa18498c01d9f9fd4a.html#define N 1111vector v[N];stack s;bool vis[N];bool inStack[N];int low[N],dfn[N];int belong[N];//属于哪个强连通分量int n,m,step,t原创 2012-01-27 02:39:51 · 579 阅读 · 0 评论 -
【2-SAT】
具体推荐先看这个《由对称性解2-SAT问题》算法合集之《由对称性解2-SAT问题》 再看赵爽的2-SAT解法浅析 看完了就基本明白2-SAT是怎么一回事,说白了就是约束!而做这种题的关键是建图!其他的就套模板,什么强连通缩点,拓扑染色。。。下面就具体以poj两道题为例说说,poj3683是输出具体方案,poj2723是输出方案数算法流程:1.构图2.求图的极大强连通子图原创 2011-08-11 20:39:00 · 854 阅读 · 0 评论 -
【2-SAT】POJ 3648
题意:一对新婚的夫妇邀请(n-1)对夫妇来参加自己的宴会,这对新人以及这些受邀请的夫妇都坐在长桌子的两边,新娘和新郎分别坐在桌子的两侧,新娘不希望看到她邀请来的那些夫妇之中有妻子和丈夫坐在同一边的情况(即妻子和丈夫要分作桌子的两边),在这n对夫妇中有一些男女存在着暧昧的关系,所以新娘也不希望看到有暧昧关系的人坐在她对面的那一侧.求解是否存在一种满足新娘要求的座位分配方案,如果存在的话,那么就输出这原创 2012-01-26 06:10:43 · 1891 阅读 · 0 评论 -
【2-SAT】POJ 3207
这题读起来有点蛋疼,真是英语害死人!题意是有n个点在圆的边缘,编号是0~n-1顺时针,有m条线(不一定是直线,线可以再圆内,也可以再圆外),问是否存在所有线不想交的情况方法:2-SAT,以所有线为点,两两枚举,假设i代表在圆内,i'代表圆外,如果线i与线j在圆内相交,就连i---j'还有j---i',注意要连双向边,然后就套模板,如果两个矛盾点在同一个强连通分量里就false。#def原创 2012-01-27 00:11:08 · 535 阅读 · 0 评论 -
【图染色】POJ 1419 & UVA 193
暴力dfs,先假设全部为白色,然后枚举每个点,对每个点dfs乱搞,网上搜了下可以用最大团做,没见过,先放在这里,学会了再做一遍!#define N 102int color[N];int g[N][N];int maxm,len;int n;int ans[N];int num;void dfs(int u){//0——白色,1——黑色 int i,j; if原创 2012-02-11 18:29:02 · 761 阅读 · 0 评论 -
最大二分匹配【转】
**********************************************************************转自Hao的博客http://chhaj5236.blog.163.com/blog/static/1128810812009910102617216/**************************************************原创 2011-05-04 10:17:00 · 1176 阅读 · 0 评论 -
【最大流】HDU 3572
http://acm.hdu.edu.cn/showproblem.php?pid=3572题意:给出n个任务+m台机器,还有一个任务处理时限+开始时间+结束时间,一个时刻里一台机器只能处理一个任务,但是一个任务可以在不同机器处理,问能否处理完所有任务?方法:最大流。这个题的建图算是经典,因为限定每个时刻每台机器只能处理一个任务,所以可以把时间点分配给各个合法的机器...具体是先设定一个超原创 2012-03-14 20:11:34 · 1106 阅读 · 1 评论 -
【tarjan求双连通分量+染色判二分图】POJ 2942
这题debug的好郁闷啊!!!先是染色有问题,然后就是各种小错误....判奇圈可以用二分图标准,因为奇圈肯定不是二分图,之前还要分离各双连通分量.......染色法判二分图一定要先对分量里每一个点都染一次色再枚举任意两个相邻的点看是否有同色,就是因为这里wa了n次!!!#define N 1005vector v[N];vector lin[N];int dfn[N],low[N];原创 2012-03-15 02:08:31 · 685 阅读 · 0 评论 -
【双连通分量】POJ 3352 3177
POJ 3352 跟POJ 3177其实是一样的,只不过3177可能有重边,要特判。3352问改造后去掉一条边仍然连通,3177问改造后任意两点至少有两条不同的路,其实是一样的,都是先找出桥,把各分量缩成一点变成一棵树,结果就是(子叶数+1)/2#define N 1005vector v[N];int low[N];bool vis[N];int du[N];int cnt原创 2012-02-09 03:16:40 · 469 阅读 · 0 评论 -
【tarjan求解双连通分量】
无向图的连通分支(连通子图): 判断一个无向图是否连通,如果进行dfs或者bfs之后,还有未访问到的顶点,说明不是连通图,否则连通。求解无向图的所有连通分支: 只需要重复调用dfs或者bfs 就可以解决:遍历顶点,如果v 未访问,则对其进行dfs, 然后标记访问。关节点(割点): 是图中一个顶点v, 如果删除它以及它关联的边后,得到的新图至少包含两个连通分支。双连通图: 没有关原创 2012-02-09 03:21:41 · 2485 阅读 · 0 评论 -
【有向图的最小树形图---朱刘算法】模板
最小树形图找到一个关于树的学习网址,赞~ http://acm.nudt.edu.cn/~twcourse/Tree.html无向图的最小生成树可以用prim算法或者Krusual算法求,而有向图的最小生成树也叫最小树形图,它是先固定一个根,再求出权值最小的树形图模板#define N 1005#define type int#define MAX INT_原创 2011-09-06 01:40:36 · 4218 阅读 · 0 评论 -
【有上下界的网络流】
相对于一般的网络流,有上下界的网络流的某些边多出了流量下界的限制,如边u->v,上下界为high、low,如果有流经过这条边,这个流必须在[low,high]这个区间内。这类题目主要要求解决下面三个问题,“有源汇、无源汇的可行流”、“有源汇的最大流”、“有源汇的最小流”,注意这里所说的源汇是原网络中的源汇,分别记为s、t。 这类题目的难点在于下界的限制很难处理,我们将所有有下界限制的边中分离转载 2012-01-18 03:19:07 · 4111 阅读 · 0 评论 -
【Havel定理判断可图化】POJ 1659
这里首先复习一下什么叫“简单图”(其实是自己忘记了==!).......一个图如果不含重边或环则称为简单图。1 、Havel 定理:把度排序,从大到小,类似拓扑排序,只是把过程反过来而已。具体过程:贪心的方法是每次把顶点按度大小从大到小排序,取出度最大的点 Vi,依次和度较大 的那些顶点 Vj 连接,同时减去 Vj 的度。连接完之后就不再考虑 Vi 了,剩下的点再次排 序然后找度最大的原创 2012-03-20 18:26:30 · 1718 阅读 · 0 评论 -
Tarjan O(n+m) 算法【转】
对于强连通相关概念可参考这里推荐BYV大牛的文章O(n+m)http://www.byvoid.com/blog/scc-tarjan/****************************************************************************************************************************转载 2011-05-26 02:02:00 · 1194 阅读 · 0 评论 -
【区别】最短路&最小生成树
一句话概括:最小生成树是计算从一节点到另一节点的最小边集;最短路是带权路径,计算权值最小。也就是说,最小生成树要经过每一个点,而最短路只需要能达到某两点,路径权值最小即可!两个算法具有相当大的相似性,而且都用到了贪心思想,所以把他们放到一起。【最短路】常用的算法有dijkstra,bellman-ford,floyd,而【最小生成树】则是prim和kruskal。下面是各个算法的模板。原创 2011-07-17 20:31:25 · 3494 阅读 · 0 评论 -
【弱连通分量】POJ 2762
http://poj.org/problem?id=2762题目给出n个点m条单向边,问是否存在取任意两点x,y,使得可以x->y或y->x,其实就是求弱连通分量....方法:缩点+拓扑。因为环内各点肯定可以任意到达,缩完点后就可能变成树或森林,当树是一条链的时候才存在弱连通分量,拓扑一下就ok...一开始看不到The cave has n rooms, andone-waycor原创 2012-03-14 19:08:40 · 3526 阅读 · 1 评论 -
【树的分治统计点对距离<=k】POJ 1741
虽然是看别人做的,但是有点不明白他那个标记数组vis,因为他标记的是反向边,而我习惯标记点,因此搞了很久,终于让我想明白了,如果想要标记点的话,因为是双向邻接表,只需要标记分治出来的根节点就行了,然后一层层分治下去,好好体会http://hi.baidu.com/yy17yy/blog/item/865dee006f8663147aec2cee.html#define N 10010原创 2012-01-31 09:11:44 · 1233 阅读 · 0 评论 -
【dfs找不在简单路径的点】ZOJ 10th Anniversary Contest C ZOJ 3583
纯YYint g[111][111];bool vis[111];bool visit[111];int pre[111];int n,m,s,t;void dfs(int u){ int i; if(u==t || vis[u]){ while(u!=s){ vis[u] = 1; u = pre[原创 2012-03-11 20:02:59 · 1258 阅读 · 11 评论 -
【二分匹配匈牙利算法模板】
注意内外循环!!!#define N 204int match[N];bool vis[N];int g[N][N];int n,m;bool sear(int s){ int i,j; for(i=1;i<=m;i++){//内循环是y集合(可以根据下一行的邻接矩阵改变一下) if(g[s][i] && !vis[i]){ v原创 2012-02-12 02:42:53 · 556 阅读 · 0 评论 -
【最大团】POJ 3692
最大团 = 补图最大独立集 = 补图全集 - 补图最小路径覆盖 = 补图全集 - 补图最大匹配#define N 204int match[N];bool vis[N];int g[N][N];int n,m;bool sear(int s){ int i,j; for(i=1;i<=m;i++){//内循环是y集合 if(g[s][i] && !vi原创 2012-02-12 02:44:51 · 565 阅读 · 0 评论 -
【最大团模板】
ZOJ 1492 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=492/*最大团 = 补图G的最大独立集数———>最大独立集数 = 补图G'最大团*///最大团模板#define N 102int mx;//最大团数(要初始化为0)int x[N],tuan[N];int can[N][N];//can原创 2012-02-12 01:50:19 · 1693 阅读 · 0 评论 -
SPFA最短路
B-F 适用条件&范围单源最短路径(从源点s到其它所有顶点v); 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图); 边权可正可负(如有负权回路输出错误提示); 差分约束系统;算法描述对每条边进行|V|-1次Relax ( 就是松弛操作 )操作; 如果存在(u,v)∈E使得dis[u]+wFor i:=1 to |V|-1 d原创 2011-05-22 00:01:00 · 1377 阅读 · 1 评论