[kuangbin]专题九 连通图 题解+总结】的更多相关文章

kuangbin专题链接:https://vjudge.net/article/752 kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian/p/13110438.html 最小生成算法 介绍 和 模板 次最小生成树:介绍及模板 总结: 文章目录 目录 总结: 1.Jungle Roads 2.Networking prim 算法 kruskal算法 3.Constructing Roads 4.Agri-Net 5.The Uniqu…
    ID Origin Title   76 / 163 Problem A POJ 1236 Network of Schools   59 / 177 Problem B UVA 315 Network   49 / 151 Problem C UVA 796 Critical Links   28 / 109 Problem D POJ 3694 Network   39 / 98 Problem E POJ 3177 Redundant Paths   33 / 230 Proble…
题目链接:https://vjudge.net/problem/POJ-3694 题目:给定一个连通图,求桥的个数,每次查询,加入一条边,问加入这条边后还有多少个桥. 思路:tarjan + 并查集 + lca(朴素) 先用tarjan缩点(成环缩点),并存下桥,把每个scc都存下一个源点(源点(boss):以这个点代表这个scc). 用存下的桥,用并查集重新建图,为了方便之后的操作,并查集建立一颗树,dfn小的在上,dfn大的在下. lca,用每个点的boss的dfn去跑lca,因为我们建树的…
题目链接:https://vjudge.net/problem/HDU-4635 题目:有向图,给定若干个连通图,求最多还能添加几条边,添完边后,图仍然要满足 (1)是简单图,即没有重边或者自环 (2)不是有向强连通图 思路:我们可以这么想,n个顶点,一个有向图边数最多,就是有向完全图,则边数为n*(n-1). 要满足不是强连通图,我们可以假设有一个tarjan缩成的点(scc),它不能到达其他所有点,或者其他所有点 不能到达它,假设这个scc有k个顶点,也就是说,k*(n-k)条边是不存在的,…
题目链接:https://vjudge.net/article/371?tdsourcetag=s_pcqq_aiomsg 题目:给定一个连通图,题目说,任意两个点至少有一条路线可以相互到达, 为保证任意两点有完全不同的路线(点可以相同,边不能相同)可以相互到达至少需要加几条边. 思路:tarjan缩点,之后重构图,找出度数为1的scc个数scc_cnt,这些点相互连接,答案可以得出是 (scc_cnt+1)/2. 两组样例: n = 5 ,m = 4  |  (1 2)  (1 3) )(1…
题目链接:https://vjudge.net/problem/HDU-4612 题目:一个大地图,给定若干个连通图,每个连通图中有若干个桥,你可以在任意某个连通图的 任意两个点添加一条边,问,添加一条边后,大地图中最少剩下几个桥. 思路:tarjan缩点,重构图,对每个新图跑两次dfs求出树的直径,取所有新图的直径max, 答案就是  大地图总桥数 - max(树的直径). #include <iostream> #include <cstdio> #include <al…
题目链接:https://vjudge.net/problem/POJ-1236 题目:有向图,有若干个连通图,点之间有单向边边就可以单向传递信息,问: (1)至少需要发送几份信息才能使得每个点都传递到信息 (2)至少需要加几条边,才能使得“把一份信息发送到任意某个点就能传播到其他所有点”成立 思路:tarjan求强连通分量,强联通分量可以相互传递消息,然后,按强联通编号重构图, 统计每个强联通分量的入度出度情况.第一个答案,就显然是入度为0的点,第二个就是max(p,q),构成一个强联通图 这…
这个题最开始我想的是,直接缩点求双连通分量,连接这些双联通分量不就行了吗? 但是其实是不对的,双连通内部双联通,我们如果任意的连接一条边在这些双联通分量之间,他们之间有没有桥其实并不知道. 我应该是求缩点以后的叶子节点的个数,因为叶子节对于其本身来说,只有一条桥于其相连,我们可以连接两个叶子节点.那么这个两个区域就合成了一个双联通分量区域.同时为了减少边的使用,我们可以连接两个都是叶子节点的点.最后+1,剩下一个也应该连接.这样就能非常容易的算出把图变成双连通,所需要的边的数目. #includ…
这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非常简单,我们可以LCA进行求解,我们在a和b点两个点之间加入新的边,那么相当于连通了a,b,那么原来a,b以及其LCA上的桥,变成不是桥了,为什么???很简单 我加入这条新的边以后,那么从这两个点,到LCA组成了一个环,我们知道环上面的线一定不是桥,所以我们,可以通过寻找LCA,计算出我们减少的桥.…
这道题就是要求桥的个数. 那么桥相应的也有判定的定理: 在和u相邻的节点中,存在一个节点是最小的时间戳都比 当前u的访问次序要大,也就是说这个点是只能通过果u到达,那么 他们之间相邻的边就是的桥 #include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> using namespace std; ; struct node{ int u,v; }brige[SIZE]…