zoukankan      html  css  js  c++  java
  • [啊哈算法]关键道路(图的割边)

    Description

    割边也称为桥,即在一个无向连同图中,如果删除某条边后,图不再联通,那么这条边就是图的割边。下图中左图不存在割边,而右图有两条割边,分别是2-5和5-6。

     

    Input

    输入第一行有两个整数n,m。n表示有n个顶点,m表示有m条边。

    接下来m行,每行形如"a b"表示顶点a和顶点b之间有边。

    Output

    输出图的所有割边,形如"a-b"表示顶点a到b的边。

    Sample Input

    6 6
    1 4
    1 3
    4 2
    3 2
    2 5
    5 6
    

    Sample Output

    5-6
    2-5
    

     1 #include<iostream>
     2 //#include<fstream>
     3 using namespace std;
     4 int n,m;
     5 int root;
     6 int e[103][103];
     7 int num[103];
     8 int low[103];
     9 int index;
    10 void dfs(int cur,int father){
    11     index++;
    12     num[cur]=index;
    13     low[cur]=index;
    14     for(int i=1;i<=n;i++){
    15         if(e[cur][i]==1){
    16             if(num[i]==0){
    17                 dfs(i,cur);
    18                 low[cur]=min(low[cur],low[i]);
    19                 if(low[i]>num[cur])
    20                     cout<<cur<<'-'<<i<<endl;
    21             }
    22             else if(i!=father)
    23                 low[cur]=min(low[cur],num[i]);
    24         }
    25     }
    26 }
    27 int main(){
    28 //    fstream file("haha.txt");
    29 //    file>>n>>m;
    30     cin>>n>>m;
    31     for(int i=1;i<=n;i++){
    32         for(int j=1;j<=n;j++){
    33             e[i][j]=0;
    34         }
    35     }
    36     int a,b;
    37     for(int i=1;i<=m;i++){
    38     //    file>>a>>b;
    39         cin>>a>>b;
    40         e[a][b]=1;
    41         e[b][a]=1;
    42     }
    43     root=1;
    44     dfs(1,root);
    45     return 0;
    46 }

    割边比割点简单,只要把条件low[i]>=num[i]改成low[i]>num[i]就行了,并且割边的代码里因为不用判断cur是否为根节点,
    所以也不用child了,


  • 相关阅读:
    2020年天梯赛补题报告
    补提报告...
    2020.11.14天梯赛练习*6 补题
    2020-11-08补题报告
    2020-10-30 — 补题报告
    10-24 补题
    2020.10.17天梯赛练习 和 16 号个人赛 补题报告
    elasticsearch DQL 有关表达式的设计
    tab键和空格键
    emacs配置python开发环境
  • 原文地址:https://www.cnblogs.com/fate-/p/12254734.html
Copyright © 2011-2022 走看看