回 帖 发 新 帖 刷新版面

主题:【W求助】切断道路

切断道路(BREAK)
提交文件名:BREAK.PAS
问题描述:
圣诞老人有一些土地放养驯鹿。这些土地之间有道路相连,每条道路连接两块土地。可是圣诞老人很担心一旦洪水冲垮了某一条道路,它的土地就不再连通了,这样的道路成为“关键路”。我们的任务就是找出所有关键路的总数。
          F1-----F2----F3
                   \  /
                    F4

输入文件(BREAK.IN):
第一行为两个整数,土地数F(1<=F<=1000)和道路数R(1<=R<=1500〉土地以1至F编号。接下来的R行,每行有两个整数,表示一条道路连接的两块土地。
输出文件(BREAK.OUT):
仅有一行,包含一个整数,表示关键路的总数。
输入输出样例:
BREAK.IN
4 4
1 2
2 3
3 4
2 4

BREAK.OUT
1


原解我有 我要思想方法。。

回复列表 (共2个回复)

沙发

这是图论中的割边问题,如果你知道割边问题就好解了....

板凳

我们定义lowlink和dfn。父子边e=u→v ,当且仅当lowlink[v] > dfn[u]的时候,e是割边。
PROCEDURE DFS(v);
begin
    inc(sign); dfn[v] := sign; //给v按照访问顺序的先后标号为sign
    lowlink[v] := sign; //给lowlink[v]赋初始值
    for 寻找一个v的相邻节点u
        if 边uv没有被标记过 then
        begin
            标记边uv;
            给边定向v→u;
            if u未被标记过 then
            begin
                DFS(u); //uv是父子边,递归访问
                lowlink[v] := min(lowlink[v],lowlink[u]);
                if lowlink[u] > dfn[v] then vu是割边 
            end
            else    lowlink[v] := min(lowlink[v],dfn[u]); //uv是返祖边
        end;
end;

我来回复

您尚未登录,请登录后再回复。点此登录或注册