poj1236 Network of Schools
- 先用tarjan计算强连通分量缩点
- 统计缩点后的点的入度和出度
- A问的是最少需要发布多少份,即入度为0的点有几个
- B问的是最少添加几条边可以使只有一个强连通分量,即统计出度为0的点的个数,如果A大于B,输出两个A
uva796 Critical Links
- 题意:给你一张图,问有多少割边
- 输入数据格式比较特殊,例如:
0 (1) 1
。所以采用下面这种方式输入scanf("%d",&u);scanf(" (%d)%c",&m,&ch);
- 图中会用多个连通块,所以要采用标记数组,查看哪些点没有访问过
- 之后就是求割边的模版套进去就结束了
hdu4738 Caocao’s Bridges
- 求割边问题,找出权值最小的一条割边
- 考虑图不连通时,输出
-1
- 如果权值最小为零时,输出应该是
1
(最少需要一个人去炸桥)
uva315 Network
- 求割点问题,题意比较难读懂……
- 割点条件搜索的根节点有两个或两个以上子节点
- 普通的节点u,有一个子节点v,满足low[v]>=low[u]
poj3177 Redundant Paths
- 题意:给你一张无向连通图,判断至少添加多少条边,才能使任意两点之间至少有两条相互“边独立”的道路
- 求出强连通分量,用并查集缩点
- 最少边数=(缩点后的树中度为1的节点数+1)/2
hdu4612 Warm up
- 题意:给你一张无向图,问添加一条边最多消去原图中多少桥?
- 先找出桥,之后在dfs搜索不走桥,将联通块标记出来,再按桥将联通块连接起来构成新图
- 问题转换成新图中最长的一条路是多少,变成求树的直径问题。随便找一点dfs,找出搜索到最远的点,再从最远的点开始搜索,找出最远的距离就是树的直径
hdu4635 Strongly connected
- 题意:给定一张有向图,问最多能再添加几条边(不出现重边)使图不是强连通图
- 一张n个顶点的图,最多不重复的边是n*(n-1)条。图变成强联通图的情况是,在符合条件的情况下多增加了一条边。所以,假设那种情况下已经有两个点的集合x和y,如果x在向y连接一条边就变成强连通图。x集合内部都是强连通,y集合内部都是强连通,x内每个顶点都有到y内每个顶点都有一条边。这种情况下的边数是x*(x-1)+y*(y-1)+x*y,化解一下就是n*n-n-m-x*y,之后只要x内的点最小的,就是结果最大。
- 满足上面条件的x,只需要找连通块的入度或出度中有一个为零即可。
poj3694 Network
- 题意:先给定一张无向图,之后在给出一些边,问每次增加一条边后,图中还会有多少条桥?
- 先用tarjan将图的点合并到连通分量中,再更具桥来建立一张新的图。
- 问题可以转换成LCA最近公共祖先来解决,先用dfs对图分层和记录每一点的祖先,每次查询找出公共祖先,然后统计一下一共有多少桥。考虑到每次加入一条边后,会有桥消失,所以用并查集来跳过已经删除的桥
- 模版写错导致WA了好几次……谨记