zoukankan      html  css  js  c++  java
  • UVA 796 Critical Links —— (求割边(桥))

      和求割点类似,只要把>=改成>即可。这里想解释一下的是,无向图没有重边,怎么可以使得low[v]=dfn[u]呢?只要它们之间再来一个点即可。

      总感觉图论要很仔细地想啊- -一不小心就弄混了。。

      另外从这题发现,代码还是写成模块化比较好,比如solve一个函数,init一个函数等等,这样可以避免很多东西忘记写,比方说dfn或者G的清空等等。。

      代码如下:

      1 #include <stdio.h>
      2 #include <stack>
      3 #include <algorithm>
      4 #include <string.h>
      5 #include <vector>
      6 using namespace std;
      7 
      8 const int N = 100+5;
      9 
     10 stack<int> S;
     11 int scc_cnt;
     12 int dfs_clock;
     13 int dfn[N];
     14 int low[N];
     15 int iscut[N];
     16 vector<int> G[N];
     17 int n;
     18 
     19 struct bridge
     20 {
     21     int u,v;
     22     void clear()
     23     {
     24         if(this->u > this->v) swap(this->u,this->v);
     25     }
     26     bool operator < (const bridge & A) const
     27     {
     28         return u==A.u ? v<A.v : u<A.u;
     29     }
     30 };
     31 vector<bridge> ans;
     32 
     33 void dfs(int u,int fa)
     34 {
     35     dfn[u]=low[u]=++dfs_clock;
     36     for(int i=0;i<G[u].size();i++)
     37     {
     38         int v = G[u][i];
     39         if(!dfn[v])
     40         {
     41             dfs(v,u);
     42             low[u]=min(low[u],low[v]);
     43             if(low[v]>dfn[u])
     44             {
     45                 bridge bri = (bridge){u,v};
     46                 bri.clear();
     47                 ans.push_back(bri);
     48             }
     49         }
     50         else if(dfn[v]<dfn[u] && v!=fa)
     51         {
     52             low[u]=min(low[u],dfn[v]);
     53         }
     54     }
     55 }
     56 
     57 void init()
     58 {
     59     for(int i=0;i<n;i++) G[i].clear();
     60     memset(dfn,0,sizeof(dfn));
     61     dfs_clock=0;
     62     ans.clear();
     63 }
     64 
     65 void solve()
     66 {
     67     for(int i=0;i<n;i++)
     68     {
     69         if(!dfn[i]) dfs(i,-1);
     70     }
     71 
     72     sort(ans.begin(),ans.end());
     73     printf("%d critical links
    ",ans.size());
     74     for(int i=0;i<ans.size();i++)
     75     {
     76         printf("%d - %d
    ",ans[i].u,ans[i].v);
     77     }
     78     puts("");
     79 }
     80 
     81 int main()
     82 {
     83     while(scanf("%d",&n)==1)
     84     {
     85         init();
     86         
     87         for(int i=1;i<=n;i++)
     88         {
     89             int u,num;
     90             scanf("%d (%d)",&u,&num);
     91 
     92             while(num--)
     93             {
     94                 int v;
     95                 scanf("%d",&v);
     96                 G[u].push_back(v);
     97                 G[v].push_back(u);
     98             }
     99         }
    100         solve();
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    Apache OFBiz 学习笔记 之 实体引擎
    Apache OFBiz 学习笔记 之 服务引擎 二
    Apache OFBiz 学习笔记 之 服务引擎 一
    [OFBiz]开发 五
    [OFBiz]开发 四
    [OFBiz]开发 三
    [OFBiz]开发 二
    通过Wmi实现Hyper-V远程管理(一)
    wifi智能插座 一键扫描局域网内插座Ip及其它信息 Python源代码API
    .NET4.0下使用Net2.0类库或程序集
  • 原文地址:https://www.cnblogs.com/zzyDS/p/5629549.html
Copyright © 2011-2022 走看看