题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集),之后一个图变为了一颗树: 然后在统计树中度数为1的点的个数,记为cnt,则至少添加(cnt+1)/2条边. #include<iostream> #include<cstdio> #include<cstring> #include<vector> usin…
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h>//用容器写在3177这个题上会超内存,但是用临界表过了 #include<string.h>/*此代码为临界表代码*/ #define N 5100 struct node { int u,v,next; }bian[N*4]; int dfn[N],low[N],index,f[N*4],n,head[N],yong; int Min…
这两题好像是一样的,就是3177要去掉重边. 但是为什么要去重边呢??????我认为如果有重边的话,应该也要考虑在内才是. 这两题我用了求割边,在去掉割边,用DFS缩点. 有大神说用Tarjan,不过这两图好像是无向图,不过那个求割边的算法蛮像Tarjan的,不知道那是不是就是Tarjan. 关于双联通分量,我还要再去学一下,问题还有很多,比如,点双联通,边双联通等等. 我现在只知道: 1.对于无向图,去掉割边后,仍然联通的区域,就是边双联通区域. 2.若要使得任意一棵树(无向图),在增加若干条…
#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; const int MAXM = 500005; int n, m; int fir[MAXN], nxt[MAXM<<1], to[MAXM<<1], cnt = 1; int low[MAXN], dfn[MAXN], stk[MAXN], scc[MAXN], scccnt, indx, tmr; inline void A…
题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象).当有人从别人口中得知自己的生日时,游戏结束.请问该游戏一共可以进行几轮? 输入输出格式 输入格式: 输入共2行. 第1行包含1个正整数n表示…
这道题要逆向思维 反过来从大到小枚举, 就是在矩阵中一点一点加进去数字,这样比较 好操作, 如果正着做就要一点一点删除数字, 不好做. 我们需要在这个过程中维护联通块的个数, 这里用到了并查集. 首先加进去一个数, 联通分量数字先加一, 然后再考虑有没有和其他联通分量 相连.从当前位置四个方向枚举, 如果这个数之前已经被选中, 同时 不是一个联通分量, 那么也就是说当前这个木块把两个联通分量变成一个 联通分量, 联通分量数减去一. 这里还要把二维的化为一维的编号, 方便并查集操作. 然后注意这里…
http://poj.org/problem?id=3592 题意 :给你一个n*m的矩阵,每个位置上都有一个字符,如果是数字代表这个地方有该数量的金矿,如果是*代表这个地方有传送带并且没有金矿,可以传送到指定的位置,如果是#代表该位置不可走,初始位置在左上角,只能向下或向右走,并且走到传送带的时候可选择是否传送.问当走出去的时候能获得的最大近况数是多少. 思路 :先将二维矩阵转化成一维的点建图,可以向下向右建图,而且传送带也可以建边,缩点之后再建边,最后用spfa求最长路. #include…
转自:https://www.zhihu.com/question/40746887/answer/88428236 连通分量有三种∶边双连通分量,点双连通分量,强连通分量,前两种属于无向图,后一种属于有向图 定义: 双连通分量又分双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图.一个无向图中的每一个极大点(边)双连通子图称作此无向图的点(边)双连通分量. 代码如下: 点双联通 struct Edge{ i…
定义:在一张有向图中,两个点可以相互到达,则称这两个点强连通:一张有向图上任意两个点可以相互到达,则称这张图为强连通图:非强连通图有极大的强连通子图,成为强联通分量. 如图,{1},{6}分别是一个强连通分量,{2,3,4,5}是一个强连通分量.而Tarjan算法可用于求解强连通分量. Tarjan算法: Tarjan算法是基于深度优先搜索的算法,每个强连通分量都是搜索树中的一个子树. 实现:dfn[u]表示到u节点时的标记(时间戳),low[u]表示u所能走到的节点中,点的最小的次序号(dfn…
战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报. 输入格式: 输入在第一行给出两个整数N(0 < N <=500)和M(<=5000),分别为城市个数(于是默认城市从0到N-1编号)和连接两城市的通路条数.随后M行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔.在城市信息之后给出被攻…