这题是比较模板的找点双联通并记录的题目. 题意大概是:一个公园有n个景点,1.所有游客都是绕环旅游的,找出所有不在环内的路的条数:2.如果两个环中有重复的边,那么这些边是冲突的,问冲突的边的总数. 分析:1.即桥的条数:2.找出点双联通分量,在他们内部找重复的边,或者换句话说,找出所有点双联通分量,边数大于点数的,这些边都是冲突的. 那么,什么是点双联通分量呢,就是任意两点都有两条或以上的路径,这些路径的点除了这两点以外,都不相同,或者说,内部无割点,像数字8的形状就不是,8是边双联通:或者再换…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 Railway Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2780    Accepted Submission(s): 953 Problem Description There are some locations in a…
在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖先的所有边都不是桥了...... #pragma comment(linker, "/STACK:10240000000000,10240000000000") #include<stdio.h> #include<stack> #include<string…
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h> #define N 1100 int top[N],ma[N][N],dfn[N],low[N],index,f[N][N],n; int Min(int a,int b) { return a>b?b:a; } void tarjan(int u,int pre) {// dfn[u]=lo…
这是一道用tarjin求双连通分量的题: 其中,不需要修的道路就是桥的数目: 在图的每个极大环中,如果点的数目小于边的数目,显然这个环中含有子环,并且这个环的边数就是这个环中有冲突的边的数目: 如果点的数模等于边的数目,那就没有冲突: 代码: #include<cstdio> #include<vector> #include<cstring> using namespace std; #define maxn 10005 vector<int>g[maxn…
一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #include <cstdio> #include <map> #include <string> #include <algorithm> #define N 10001 using namespace std; int head[N],num,dfs[N],lo…
加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stack> #define N 200001 using namespace std; int belong[N],head[N],…
2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要士兵                   带过去,士兵的数量不能小于目标桥的守卫,求出最少要派出多少士兵. 比赛一开始yyf就跟我说第一题是联通题,把题意跟我说了一下,我就知道是双联通求桥,但是看到比赛一开始第一题一片血红色,就觉得肯定有坑,自己写了一遍,结果wrong了.后来才知道这题有两个坑,如…
题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆数字,要从每个集合中选择一个恰好一个数加起来.求所有的这样的和中,前 K 大的是哪些.这就是一个经典问题了. 点双联通就不说了 都一眼能看出来做法就是缩点之后每个环每次取一个,然后找最大的k个所以这道题的难点就在这里,做法当然是不知道啦,看了题解和博客才懂的.以前做过两个集合合并的,这个是k个合并,…
/*先求出双联通缩点,然后进行树形dp*/ #include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #define N 11000 struct node { int u,v,next; } bian[N*4],edge[N*4]; int head[N],yong,dfn[N],low[N],index,f[N*4],cnt,n,num[N]; int yon; int…
#pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了 #include<stdio.h> #include<queue> #include<string.h> using namespace std; #define N 210000 #define inf 99999999 struct node { int u,v,w,next; }bian[N*20],biant…
Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图: 如果在一个有向图中,每两个点都强连通,我们就叫这个图叫强连通图. (一张十分简洁的图) 如图,图中{1,2}就是一个强连通,也是这个图中的一个强连通分量 求强连通分量的算法有三种: Kosaraju算法,Tarjan算法,Gabow算法(然而我只会用Tarjan求) 这里就稍微介绍一下tarja…
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 7206    Accepted Submission(s): 1681 Problem Description N planets are connecte…
HDU # 题意 有一个简单图,n个点,m条边.对于每条割边,求出删去这条边后,在两个联通块中各取一个u,v.使得u<v,并且u尽量大而v尽量小. # 思路 求出边双联通是肯定的. 答案的限制条件是重点. 假设分出来的两个联通块,一个的最大值是mx1,另一个的最大值是mx2.那么u = min(mx1, mx2),因为取个小点的,才能在另一个联通块中找到对应的v. 显然mx1,mx2中一个值等于n,所以我们只用找不包含n的联通块中的最大值. 怎么找,可以令n为根结点,dfs子树的最大值就行了.…
题意: 给一张无向图,求加多少边使原图任意两点边双联通. SOL: 一个不会写边双点双强联通的傻逼. 一个结论:把一棵树变成满足条件的图需要加的边使入度为1的点数+1除以2.------>就是树的叶子两两连上. 然后就是缩点然后统计就好了... 然后学会了怎么搞边双...看了几天白书还是非常显然的感觉... Code: /*========================================================================== # Last modif…
在看了春晚小彩旗的E技能(旋转)后就一直在lol……额抽点时间撸一题吧…… Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8159   Accepted: 3541 Description In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to anot…
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans+2,为1则ans+1,最后输出(ans+1)/2. 注意,如果原图本来就强联通,答案为0不是1. 在这里主要说说打边双联通的注意事项.(一开始觉得是跟点双连通差不多的,调试的时候才发现很容易疏忽导致BUG很多啊) 1.如果有重边,则那条就不是割边了,我们很容易向上重走树枝边的反向边导致程序认为这是…
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在奇圈上的点个数.容易得到,一个边双联通分量如果存在奇圈,那么整个分量上的点都属于某个奇圈. #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<alg…
题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分量则该边一定是桥, 那么我们可以先处理出所有的桥,然后把所有双联通分量缩点,缩点之后就变成了一棵树. 而树上的每一条边都是一个桥, 考虑每条边的输出,删除某一边后肯定会出现两个联通分量, 需要记录两个联通分量中最大的点max1 max2, 如果max1!=n 则答案就是max1 max1+1否则ma…
点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include <stack> #include <vector> #include <algorithm> #include <cstring> using namespace std; struct Edge{ int u, v; }; const int maxn = 1…
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到同一个点为止.途中直接进行删边处理且桥的数目减少. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define M…
题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先反向建立补图,然后问题转换成在图中找奇圈,圈肯定出现在双联通分量中,则求出图的双联通分量,又通过特性知道,一个双联通分量有奇圈则其中的点都可以出现在一个奇圈中.而对于奇圈的判定可以用交叉染色判断是非为二分图,二分图中肯定无奇圈,这里用tarjan算法得出割边(先将点入队),确定双联通分量的根节点,(…
买一送一啊  3177和3352的区别在于3177数据有重边!但是我先做3177的  那么就直接ctrl+c+v搞3352了~. 题意:给一个无向图,要令每个点之间至少有两条不重合的路,需要至少加多少条边. 思路:找出无向图中边双联通的点进行缩点后,根据缩点图的每条边(割边)给缩点增加度数,通过图的结构可以得出 公式:至少增加的边数 =(这棵树总度数为1的结点数 + 1 )/ 2. 事实上求割边的方法可以用Tarjan方法的变形来求得,同时因为是无向图,要记录其父节点pre.可以知道对于边u,v…
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被称为"点双连通分量",记为"\(v-DCC\)".无向图图的极大边双连通子图被称为"边双连通分量",记为"\(e-DCC\)". 没错,万能的图论连通性算法\(Tarjan\)又来了. 预备知识 时间戳 图在深度优先遍历的过程中,…
对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. 那么算法首先要求出割点. 从代码中可以看出:只要求出割点,就开始组一个bcc中. 如果割点两侧都不存在环的话会怎么处理呢? 代码中相邻的割点(或者是割点和根节点)也被当做一个bcc处理. bccno[i]为点i所在的bcc序号,那么割点的bccno为多少呢? 割点的bccno没有意义,割点存在于多个…
题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1..F) to another field, Bessie and the rest of the herd are forced to cross near the Tree of Rotten Apples. The cows are now tired of often being forced to t…
这两题好像是一样的,就是3177要去掉重边. 但是为什么要去重边呢??????我认为如果有重边的话,应该也要考虑在内才是. 这两题我用了求割边,在去掉割边,用DFS缩点. 有大神说用Tarjan,不过这两图好像是无向图,不过那个求割边的算法蛮像Tarjan的,不知道那是不是就是Tarjan. 关于双联通分量,我还要再去学一下,问题还有很多,比如,点双联通,边双联通等等. 我现在只知道: 1.对于无向图,去掉割边后,仍然联通的区域,就是边双联通区域. 2.若要使得任意一棵树(无向图),在增加若干条…
似乎好久都没写博客了....赶快来补一篇 题意 给你一个 \(n\) 个点 , 没有重边和自环的图 . 有 \(m\) 条边 , 每条边可以染 \(1 \to k\) 中的一种颜色 . 对于任意一个简单环 , 可以将它的边的颜色进行旋转任意位 . 询问本质不同的染色方案数个数 . 数据范围 \(1\le n \le 50, 1 \le m \le 100,1 \le k \le 100\\\) 题解 将边 (或者说是很多条边) 分为 \(3\) 种类型 : 不属于任何一个简单环 , 它的贡献为…
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1)         有向图的强联通分量 (2)         无向图的双联通分量(求割点,桥) (3)         最近公共祖先 今天主要给未来的自己讲解一下前两个应用,让未来的自己不会向现在的自己一样又忘了Tarjan怎么写.熟悉DFS的话,理解起来会简单很多. (1)         有向图的强联通分量 首先解释Tarjan中几个比较重要的值 DFN[i] : 节点i被访问到的次序 L…
题目链接:传送门 思路: 如果图是点双联通的,即没有割点,直接从图中随意选两个点即可: 如果有一个割点,删除割点,求连通块的个数即可(在每个连通块内新建一个营救点). 如果有多个割点,则可以通过其他割点到达,就不用新建营救点. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<stack>…