强连通分量SCC
Tarjan解强连通分量的科普文www.byvoid.com/blog/scc-tarjan/。
poj 2186 Popular cows
题意:奶牛的梦想是成为牛群中最受欢迎的奶牛,即受其它所有牛的欢迎。“欢迎”是具有传递性,即如果牛A认为牛B受欢迎,牛B觉得牛C受欢迎,则牛A也隐含地认为牛C受欢迎。现在,给一组点对 (A,B) 表示 A 认为 B 受欢迎,找出有多少最受欢迎的奶牛。
解法:强连通缩点预处理,如果只有一个出度为0的强连通,那么说明这个强连通里的所有牛都是最受欢迎的牛,否则不存在最受欢迎的牛。
poj 2553 The Bottom of a Graph
题意:给出一个有向图,定义:若节点u所有能到达的点v,都能反过来到达u,那么称节点u是sink,求所有的sink点。
解法:强连通分量内所有点相互构成sink,因此强连通缩点,若某强连通分量出度为0的该强连通分量内所有点均为sink点。
poj 1236 Network of Schools
题意:网络中有一些学校,每个学校可以分发软件给其他学校。可以向哪个分发取决于他们各自维护的一个清单(有向图)。有两个问题,
1:至少要copy多少份新软件给那些学校, 才能使得每个学校都能得到。
2:要在所有的学校的清单里面至少一共增加几条边才能使得把软件给任意一个学校,所有的学校都能收得到。
解法:第一问比较简单,求有多少个入度为0的强连通分量;
第二问,一个有向图是所有点强连通的必要条件是:图中所有点既有出度又有入度(不知是否有此定理),因此统计缩点后出度为0的点的个数cnout和入度为0的点的个数cnin,MAX(cnin,cnout)就是答案。注意当只有一个强连通分量时特判输出0;
弱连通图:
poj2762 Going from u to v or from v to u?
题意:判断一个有向图中是否任意两点都至少满足一点到另一点可达 (是否为弱连通图)
解法:一个图是若连通图的充分必要条件为:缩点后的Dag图包含一条包含所有点的链(拓扑序唯一且存在)。
证明:1、如果有分叉的话,分叉两边的点不能到达对方。
2、入度为0的如果>1,那么两个入度为0的点不能到达对方。
验证:将唯一的入度为0的点和出度为0的点去掉,统计补图中边数(重边不计),若补图不为空且边数=点数-1则原Dag是一条链。
割点和桥:
一个顶点u是割点,当且仅当满足(1)或(2)
(1) u为树根,且u有多于一个子树。(注意特判!!!)
(2) u不为树根,且满足存在(u,v)为树枝边(或称父子边,即u为v在搜索树中的父亲),使得DFS(u)<=Low(v)。
一条无向边(u,v)是桥,当且仅当(u,v)为树枝边,且满足DFS(u)<Low(v)。
poj 1141 Network
求割点个数,输入不是很直爽,注意根节点的特判。
poj1523 SPF
题意:求割点个数及每个割点将无向图分成多少个双连通分量。
tarjan算法,对于每条边(a,b)如果if(low[b]>=dfn[a])则说明此边是桥,subnet[a]++; subnet对应某点将无向图分成多少双连通分量。注意跟节点要特殊处理。
poj 2117 Electricity
题意:给出一个无向图,问去掉一个点最多可以形成多少个双连通分量。
解法:此题在1523基础之上加强,原图不一定连通,因此答案为原图双连通分量个数+某割点所在连通分量最大分割值-1;原图连通分量个数可在求割点过程中求得,对于任意点,如果dfn==0那就就以此点为根进行tarjan,进行了多少次tarjan就有多少个连通分量。
poj 3352 Road Construction 、3177 Redundant Paths
题意:在无向图中加多少条边使得各个点双连通。
解法:双连通缩点(low值相同的点在同一连通分量中),一个无向图所有点双连通的必要条件是所有点的度数都大于1(类似于1236那种结论 ,自己推的不知对错)。因此统计度数为1的连通分量数目num,(num+1)/2 即是答案(注意由于存储的是双向边,因此不要重复统计)。不能重边!!??