![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 76
Baoli1008
233
展开
-
hdu 1385 Minimum Transport Cost
题目链接:点击打开链接floyd算法模板题,求图中re原创 2014-07-10 21:53:48 · 460 阅读 · 0 评论 -
POJ 1149 PIGS(网络流)
第一想法是以猪圈为节点建图,但是这样点数过多,而且无法控制顺序。看到消费者数量很少,想办法以这个为节点建图。建图方法为,用pre[i]记录最近一个可以访问第i猪圈的消费者是哪个。处理每个消费者时,对于他能打开的每个猪圈i,都查询pre[i],如果之前没有,就从原点连一条边到这个人,容量为猪圈i初始猪数(从该猪圈最多取这么多)。如果之前有,pre[i]=k,那么连一条k到当前人的边,原创 2015-05-07 19:25:19 · 477 阅读 · 0 评论 -
Codeforces 557D - Vitaly and Cycle (DFS染色)
很容易想到最多只需要添加3条边。1.如果M==0,那么任选三个点连接3条边2.如果所有连通分量大小均小于等于2,那么任选一个连通分量和一个点连2条边3.如果本身存在奇圈(DFS过程中父节点和子节点颜色一样),那么答案是0 14.除此以外所有情况均可以只连一条边。把图在DFS的过程中按照一黑一白染色,那么同一连通分量中的相同颜色的点连线均可构成奇圈。所以DFS时维护一下黑原创 2015-07-27 10:31:02 · 501 阅读 · 0 评论 -
Tarjan算法求至少要添加几条边才能使无向连通图变为边双连通图。
转自:点击打开链接给定一个连通的无向图G,至少要添加几条边,才能使其变为双连通图。 模型很简单,正在施工的道路我们可以认为那条边被删除了。那么一个图G能够在删除任意一条边后,仍然是连通的,当且仅当图G至少为双连通的。 PS:不要问我为什么不是3-连通、4-连通...人家题目问“至少添加几条边”好不... 显然,转载 2015-07-18 12:18:36 · 1517 阅读 · 0 评论 -
POJ 3352 Road Construction (边双连通分量 Tarjan缩点)
本题详解在前面一篇文章Tarjan缩点的含义:low值相等的点在一个双连通分量中,把一个分量看成一个点,重构成一棵树定理:对于一棵叶子节点数为n的树,需要加(n+1)/2 条边把它变成双连通的。因此本题缩完点之后求一下这个值就是答案。对于有重边的边双连通分量,如果从u点有两条边到它的father,那么dfn[fa]也可以用来更新lowu。下面这个模板可以处理有重边的情况。原创 2015-07-19 10:59:23 · 515 阅读 · 0 评论 -
有向图的强连通分量 Tarjan算法
转自BYVoid点击打开链接[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量转载 2015-07-19 11:55:02 · 523 阅读 · 0 评论 -
HDU 3836 Equivalent Sets(强连通分量 Tarjan缩点)
Tarjan求强连通分量详解在前一篇文章把一个有向图变为强连通分量至少要加几条边?Tarjan缩点后,设a为入度为0的点数,b为出度为0的点数,答案max(a,b)。注意:如果图本来是强连通的,要特判为0,否则输入会为1代码:#include #include #include using namespace std;#include #include原创 2015-07-19 11:56:58 · 481 阅读 · 0 评论 -
LCA(最近公共祖先)离线算法Tarjan
转自ACer_FInd点击打开链接LCA(最近公共祖先)离线算法Tarjan+并查集LCA问题:给出一棵有根树T,对于任意两个结点u,v求出LCA(T, u, v),即离根最远的结点x,使得x同时是u和v的祖先。 把LCA问题看成询问式的:给出一系列询问,程序应当对每一个询问尽快做出反应。对于这类问题有两种解决方法;转载 2015-07-21 10:51:38 · 924 阅读 · 1 评论 -
HDU 5294 Tricks Device (最短路上的最小割) 2015多校训练1007
首先要求出1到N的所有最短路,第一问等于至少去掉多少条边使所有最短路断掉,第二问就是M-最短路中边数最短的路径边数。求最短路用Dijkstra即可,维护每个节点的父节点(用vector)。然后dfs对于每条边在网络流中建一条流量为1的边,最后跑一个最大流(即最小割)即可。注意:1.向函数里传对象时要加&(引用)2.dfs时要用记忆化,保证每条边走一次,否则会重复添加网络流中的边!!原创 2015-07-22 20:55:38 · 504 阅读 · 0 评论 -
POJ 2112 Optimal Milking (网络流+二分)
首先floyd求出任意两点间最短路。然后二分路径长度的最大值。 每次二分中:1对于所有长度小于等于这个最大值的 从奶牛到机器的路径,建一条流量为无限的边。2.再从源点到每头牛建一条流量为1的边。3.从每个机器到汇点建一条流量为M的边最后看看最大流是否等于C,等于则这个最大值合法。注意: 若输入数据中不同两点间距离为0,表示的是到达不了。代码:#inc原创 2015-07-23 11:49:09 · 406 阅读 · 0 评论 -
HDU 3062 Party (2-SAT模板题)
2-SAT问题:有N个值为0或1的元素,给定一些包含两元素限制条件(子句),如选择某元素则不能选某元素,或选择某元素则必须选某元素,问是否能给所有变量一组赋值使满足所有限制。解法:把所有的a,~a都当作节点。如果a,b互斥,则连边(a,~b)和(b,~a),然后用Tarjan求一下强联通分量,若任意a,~a在一个联通分量中,则无解,否则有解。代码:#includ原创 2015-08-17 18:12:01 · 476 阅读 · 0 评论 -
Codeforces 570D Tree Requests(DFS重标号+树状数组)
能成为回文串的显然是数量为奇数的字母小于2个。问题转化成求范围内点中各种字母总个数。如果能构造出一个序列使同一原创 2015-08-20 08:22:02 · 556 阅读 · 0 评论 -
HDU 5416 CRB and Tree (DFS)
DFS这棵树,对于每个点u算出从根节点到这个点总共的异或值val[u],并记录每个值的数量。因为异或的性质:1.对于u到v的这条路,不管是u,v在根节点出发的同一条路上还是两条路上,f(u,v)都等于k[u]^k[v]。2.s^t=k,则t^k=s。且询问只有10组,那么对于每个询问s,可以用遍历0到200000的所有值i,算出和每个值异或等于s的那个对应的值k,然后答案加原创 2015-08-21 09:39:55 · 388 阅读 · 0 评论 -
Codeforces 546E - Soldier and Traveling (网络流输出流量)
建图:i点拆成ai,bi两个点。源点到ai连a[i]的流量,ai到bi连INF(表示不动的士兵)bi到汇点连b[i]的流量。对于x到y的每条边连ax到by,ay到bx,流量为INF的边(士兵移动)。跑出最大流看是否等于a[i]或b[i]之和。重点是输出方案,当最大流跑完后遍历1到N的点(表示初始状态的点)的邻接表,如果有流量flow大于0的边,就说明这个方案中沿着这条边有flow个士兵移动原创 2015-08-21 15:48:53 · 561 阅读 · 0 评论 -
Codeforces Round #257 (Div. 1) B. Jzzhu and Cities (记录最短路数量)
首先把K条特殊边处理一下,到同一个点的只保留最短的,其余都去掉并维护答案。这样形成一棵树。然后再把这些边和m条普通边一起跑堆优化的dijkstra,并记录最短路数量。然后对于上一步剩下的每条特殊边,如果最短路长度小于它那一定可以去除,如果最短路长度等于它,就看最短路数量,如果等于1,说明就是这条特殊边,不能删,如果大于1说明有别的路,可以删。下面记录路径写的是简略版,因为本题只关心是不是大于1原创 2015-09-11 12:24:50 · 652 阅读 · 0 评论 -
POJ 1698 Alice's Chance (网络流)
构图:最多50周,350天源点到每一天连一条容量为1的边,对于每个电影,可以拍摄的那些天连一条容量为1的边到这个电影,每个电影连一条容量为需求总天数的边到汇点。看最大流是不是等于所有电影的需求总天数的和。点数为天数+电影数+2。代码:#include #include #include #include using namespace std;#inclu原创 2015-05-07 18:58:00 · 477 阅读 · 0 评论 -
POJ 1087 A Plug for UNIX(二分图匹配)
用set做字符串到标号的映射。用floyd做一下可转移关系的传递,确定每两种端口间是否能转移。然后根据这个关系建图,如果第i个空余端口可以转移成第j个需求端口,就从i到j建一条边。之后跑一个匈牙利算法即可。注意floyd前,要把每个点到自己的转移可能初始化为1坑:空间要开到400,因为理论上最多有400个不一样的端口出现。代码:#include原创 2015-04-17 10:48:33 · 493 阅读 · 0 评论 -
hdu 3790 最短路径问题
题目链接:点击打开链接带两种quan原创 2014-08-04 16:03:08 · 452 阅读 · 0 评论 -
hdu 1548 A strange lift
题目链接:点击打开链接题意:一部电梯,在第i层可以向上或向下Kiceng原创 2014-08-04 13:58:37 · 386 阅读 · 0 评论 -
hdu 3405 World Islands
题目链接:点击打开链接题意:求几个点的最小生成shu原创 2014-07-31 22:49:07 · 426 阅读 · 0 评论 -
hdu 1532 Drainage Ditches(网络流dinic模板)
题目链接:点击打开链接原创 2014-08-22 15:38:35 · 465 阅读 · 0 评论 -
hdu 1272 小希的迷宫
题目链接:点击打开链接题意:给你一个图,判断这个图是不是liant原创 2014-08-15 15:29:58 · 360 阅读 · 0 评论 -
hdu 1285 确定比赛名次
题目链接:点击打开链接拓扑排序m原创 2014-08-17 00:38:41 · 412 阅读 · 0 评论 -
hdu 1875 畅通工程再续
题目链接:点击打开链接prim算法模板题,需要自己求一下距离,还有一种方法是原创 2014-08-15 20:44:39 · 523 阅读 · 0 评论 -
poj 3723 Conscription
题目链接:点击打开链接基础最小生成树原创 2014-09-17 19:54:39 · 522 阅读 · 0 评论 -
UVa 10917 Walk Through the Forest(最短路+DP)
求出办公室到每一点的最短路d[i],然后记忆话搜索,dp[i]由和i点相邻且d[j]代码:#include #include #include #include #include #include #define INF 10000000using namespace std;int N,M;struct edge{ int s,t,c;};vect原创 2015-03-30 22:34:41 · 592 阅读 · 0 评论 -
UVa 11374 Airport Express(优先队列Dijkstra)
从起点,终点分别做两次Dijkatra,算出每一点到起点的最短路程d[i]和到终点的最短路程c[i],枚举K条商业线,作为连接最短路的边,看看d[i]+c[j]+W[i][j]是不是更小了。代码:#include #include #include using namespace std;#include #include #include #define INF 1原创 2015-03-31 11:16:25 · 553 阅读 · 0 评论 -
POJ 1041 John's trip(欧拉回路)
本题有两个要求,一是求欧拉回路,二是保证路径字典序最小联通图有欧拉回路的充要条件是每个点的度都是偶数从起点开始DFS,顺序保存DFS路径(在递归中用栈),把每一段连续走的DFS路径看成独立的部分,如果走到一个位置不能走了,而且还有其他边没有遍历,那么就说明这个部分应该在其他未遍历的部分后走,所以DFS回溯到之前的结点后,再走另一条支路,这一段的路径应该在之前那段路径的前面。这些用栈原创 2015-04-04 11:13:23 · 671 阅读 · 0 评论 -
POJ 1094 Sorting It All Out (拓扑排序)
把每个X如果发现有环,说明出现了不合法情况;如果没有环,且拓扑排序过程中queue中元素从未超过两个(保证拓扑路径唯一性),且拓扑路径长度为N,说明关系确定了;否则是未确定状态。拓扑排序过程如下:1.用一个queue保存可能在拓扑路径中的点2.初始化时把所有入度为0的点加入queue3.每次先判断queue中元素是否有多个,如果有,当前状态不可能是确定状态。然后原创 2015-04-08 20:12:41 · 408 阅读 · 0 评论 -
二分图最大匹配 匈牙利算法
转自:点击打开链接用匈牙利算法求二分图的最大匹配什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识);第二种就是我现在要讲的匈牙利算法。这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高了效率。匈牙利算法其实很简单,但是网上搜不到什么说得清转载 2015-04-15 18:54:26 · 583 阅读 · 0 评论 -
POJ 3013 Big Christmas Tree (SPFA最短路)
题意看了好久才明白,圣诞树是一个树形结构,对于每条边,它的子孙节点等于这条边中深度较低的那个点的所有子孙节点。本题中一条边的费用就是这条边的所有子孙节点重量和乘上这条边的单位费用。换一个角度考虑,考虑每个节点会被哪些边包括,答案就是从这个节点到根节点路径上的所有边。这样把每条边的单位费用当作权值,对每个点求一个最短路,答案就是每个点的重量乘上该点最短路的权值在做和。注意No Answer的情况原创 2015-04-20 18:13:50 · 525 阅读 · 0 评论 -
HDU 4751 Divide Groups (判断二分图染色模板)
#include #include #include using namespace std;#define maxn 110struct node{ int next,to; node(){} node(int nn,int tt){ next=nn; to=tt; }}G[maxn*maxn];int head[maxn];原创 2015-10-30 18:55:37 · 503 阅读 · 0 评论