求割点

一种显然的n^2做法:

  枚举每个点,去掉该点连出的边,然后判断整个图是否联通

用tarjan求割点:

  分情况讨论

  如果是root的话,其为割点当且仅当下方有两棵及以上的子树

  其他情况

  设当前节点为u,一个儿子节点为v

  存在low[v]>=dfn[u],也就是说其儿子节点v能连到的最前面的点都在u的下面

  也就是当u断开的时候,u之前的点与以v为根的子树必然分成两个独立的块

  那么这个时候u就是割点


  

Network

A Telephone Line Company (TLC) is establishing a new telephone cable network. They are connecting several places numbered by integers from 1 to N . No two places have the same number. The lines are bidirectional and always connect together two places and in each place the lines end in a telephone exchange. There is one telephone exchange in each place. From each place it is 
possible to reach through lines every other place, however it need not be a direct connection, it can go through several exchanges. From time to time the power supply fails at a place and then the exchange does not operate. The officials from TLC realized that in such a case it can happen that besides the fact that the place with the failure is unreachable, this can also cause that some other places cannot connect to each other. In such a case we will say the place (where the failure 
occured) is critical. Now the officials are trying to write a program for finding the number of all such critical places. Help them.

  直接贴模板

program poj1144;
const maxn = ;
var n,e,i,j,x,y,time,ans,u,v:longint;
fa,next,link,low,dfn,hash:array[-..maxn]of longint;
vis:array[-..maxn]of boolean; procedure add(x,y:longint);
begin
inc(e);fa[e]:=y;next[e]:=link[x];link[x]:=e;
inc(e);fa[e]:=x;next[e]:=link[y];link[y]:=e;
end; function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end; procedure tarjan(p:longint);
var j:longint;
begin
inc(time);dfn[p]:=time;low[p]:=time;vis[p]:=false;
j:=link[p];
while j<> do
begin
if vis[fa[j]] then
begin
tarjan(fa[j]);
if low[fa[j]]>=dfn[p] then inc(hash[p]);
low[p]:=min(low[p],low[fa[j]]);
end else low[p]:=min(low[p],dfn[fa[j]]);
j:=next[j];
end;
end; begin
//assign(input,'poj1144.in');reset(input);
readln(n);
while n<> do
begin
fillchar(link,sizeof(link),);
fillchar(hash,sizeof(hash),);
fillchar(next,sizeof(next),);
e:=;
read(u);
while u<> do
begin
while not eoln do
begin
read(v);
add(u,v);
end;
readln;read(u);
end;
readln;
fillchar(vis,sizeof(vis),true);time:=;
for i:= to n do if vis[i] then tarjan(i);
ans:=;
if hash[]> then inc(ans);
for i:= to n do if hash[i]> then inc(ans);
writeln(ans);
readln(n);
end; end.

矿场搭建

煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。

  首先对答案有影响的显然只有割点

  然后考虑把所有割点都去掉,剩下的联通块中如果只与一个割点相连

  这个块中就要放一个出口

  最后特判整个图是一个联通块的情况

  

program bzoj2730;
const maxn = ;maxm = ;
var n,e,time,x,y,ans1,ans2,test,root,tot,m,col:int64;
i,j:longint;
fa,next,stack:array[-..maxm]of int64;
vis,cut,used,exi:array[-..maxn]of boolean;
link,dfn,low,hash,opt:array[-..maxn]of int64; function min(a,b:int64):int64;
begin
if a<b then exit(a) else exit(b);
end; procedure add(x,y:int64);
begin
inc(e);fa[e]:=y;next[e]:=link[x];link[x]:=e;
inc(e);fa[e]:=x;next[e]:=link[y];link[y]:=e;
end; procedure tarjan(p:int64);
var j:int64;
begin
inc(time);dfn[p]:=time;low[p]:=time;vis[p]:=false;stack[time]:=p;
j:=link[p];
while j<> do
begin
if vis[fa[j]] then
begin
tarjan(fa[j]);
if low[fa[j]]>=dfn[p] then inc(hash[p]);
low[p]:=min(low[p],low[fa[j]]);
end else low[p]:=min(low[p],dfn[fa[j]]);
j:=next[j];
end;
end; function bfs(s:int64):int64;
var head,tail,x,j:int64;
begin
fillchar(used,sizeof(used),true);
tot:=;head:=;tail:=;opt[]:=s;vis[s]:=false;
while head<>tail do
begin
inc(head);x:=opt[head];j:=link[x];
while j<> do
begin
if (vis[fa[j]])and(not cut[fa[j]]) then
begin
vis[fa[j]]:=false;
inc(tail);opt[tail]:=fa[j];
end else
if (cut[fa[j]])and(used[fa[j]]) then
begin
inc(tot);
used[fa[j]]:=false;
end;
j:=next[j];
end;
end;
exit(tail);
end; begin
//assign(input,'bzoj2730.in');reset(input);
// assign(output,'col.out');rewrite(output);
readln(m);
test:=;
while m<> do
begin
inc(test);
fillchar(next,sizeof(next),);
fillchar(link,sizeof(link),);
fillchar(exi,sizeof(exi),false);
e:=;time:=;n:=;
for i:= to m do
begin
readln(x,y);
if x>n then n:=x;
if y>n then n:=y;
exi[x]:=true;exi[y]:=true;
add(x,y);
end;
fillchar(vis,sizeof(vis),true);
fillchar(hash,sizeof(hash),);
fillchar(cut,sizeof(cut),false);
for i:= to n do if (vis[i])and(exi[i]) then
begin
tarjan(i);
dec(hash[i]);
end;
for i:= to n do if hash[i]> then cut[i]:=true;
ans1:=;ans2:=;col:=;
fillchar(vis,sizeof(vis),true);
for i:= to n do if (not cut[i])and(vis[i])and(exi[i]) then
begin
tot:=;x:=bfs(i);inc(col);
if tot = then
begin
inc(ans1);
ans2:=ans2*x;
end;
end;
if col = then writeln('Case ',test,': ',,' ',n*(n-) >> )
else writeln('Case ',test,': ',ans1,' ',ans2);
readln(m);
end;
end.

[POJ1144][BZOJ2730]tarjan求割点的更多相关文章

  1. poj1144 tarjan求割点

    poj1144 tarjan求割点 额,算法没什么好说的,只是这道题的读入非常恶心. 注意,当前点x是否是割点,与low[x]无关,只和low[son]和dfn[x]有关. 还有,默代码的时候记住分目 ...

  2. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

    Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

  3. POJ 1144 Network(Tarjan求割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

  4. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  5. poj_1144Network(tarjan求割点)

    poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...

  6. 洛谷P3388 【模板】割点(割顶)(tarjan求割点)

    题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n,m 下面m行每行输入x,y表示x到y有一条边 输出格式: 第一行输出割点个数 第二行按照 ...

  7. tarjan求割点割边的思考

    这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...

  8. Tarjan求割点和桥

    by szTom 前置知识 邻接表存储及遍历图 tarjan求强连通分量 割点 割点的定义 在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多, ...

  9. tarjan求割点与割边

    tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...

随机推荐

  1. Hackerrank - The Grid Search

    https://www.hackerrank.com/challenges/the-grid-search/forum 今天碰见这题,看见难度是Moderate,觉得应该能半小时内搞定. 读完题目发现 ...

  2. Borland和Micorsoft的对话(转载自月光软件网)

      Borland与Microsoft关于Delphi的对话 Bear 1.Delphi较贵  一套Delphi的价格大约相当于两套Visual Studio  ------------------- ...

  3. Django学习笔记(一):环境安装与简单实例

    Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...

  4. C++类数组批量赋值

    类和结构体不同,结构体在初始化时可以使用{...}的方法全部赋值,但是结构体怎么办呢?一种是把数据数组写到一个相同的结构体内,然后for循环使用一个非构造函数写入到类数组中.另一种方法是直接写入到对应 ...

  5. 学习人工智能的第六个月[深度学习[Deep Learning,DL]]

    这个月阅读了论文[Partial Adversarial Domain Adaptation-eccv18],文章着眼于源域标签空间包含目标域标签空间的场景,在域对抗神经网络的基础上提出了部分对抗域适 ...

  6. 使用vue和web3创建你的第一个以太坊APP

    欢迎回到这个很牛的教程系列的第2部分,在教程中我们亲手构建我们的第一个分布式应用程序. 在第二部分中,我们将介绍VueJS和Vuex的核心概念,并引入web3js以与metamask进行交互. 如果你 ...

  7. css3弹性盒子模型之box-flex

    css3弹性盒子模型之box-flex 浏览器支持 目前没有浏览器支持 box-flex 属性. Firefox 支持替代的 -moz-box-flex 属性. Safari.Opera 以及 Chr ...

  8. linux 进程间通信之pipe

    在实际开发过程中,程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标.  每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内 ...

  9. [Elasticsearch] 多字段搜索 (六) - 自定义_all字段,跨域查询及精确值字段

    自定义_all字段 在元数据:_all字段中,我们解释了特殊的_all字段会将其它所有字段中的值作为一个大字符串进行索引.尽管将所有字段的值作为一个字段进行索引并不是非常灵活.如果有一个自定义的_al ...

  10. 算法(12)Best Time to Buy and Sell Stock II

    题目:最大收益 [1,2,3,9,2,3] 思路:这道题竟然是easy的?! 最终的解法非常简单,只要把单个波峰减去波谷就可以了,比如在上面的例子中[1-2-3-9][2-3]这就是单个波峰波谷!为什 ...