zoukankan      html  css  js  c++  java
  • uva 610(tarjan的应用)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23727

    思路:首先是Tarjan找桥,对于桥,只能是双向边,而对于同一个连通分量而言,只要重新定向为同一个方向即可。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stack>
     6 #include<queue>
     7 #include<vector>
     8 using namespace std;
     9 #define MAXN 1111
    10 typedef pair<int,int>PP;
    11 
    12 int low[MAXN],dfn[MAXN];
    13 bool mark[MAXN];
    14 int _count,cnt;
    15 vector<int>g[MAXN];
    16 vector<PP>bridge;
    17 bool vis[MAXN][MAXN];
    18 int n,m;
    19 
    20 void Tarjan(int u,int father)
    21 {
    22     int flag=0;
    23     low[u]=dfn[u]=++cnt;
    24     mark[u]=true;
    25     for(int i=0;i<(int)g[u].size();i++){
    26         int v=g[u][i];
    27         if(v==father&&!flag){ flag=1;continue; }
    28         if(dfn[v]==0){
    29             Tarjan(v,u);
    30             low[u]=min(low[u],low[v]);
    31             if(low[v]>dfn[u]){
    32                 bridge.push_back(make_pair(u,v));
    33                 bridge.push_back(make_pair(v,u));
    34                 vis[u][v]=vis[v][u]=true;
    35             }else {
    36                 bridge.push_back(make_pair(u,v));
    37                 vis[u][v]=vis[v][u]=true;
    38             }    
    39         }else if(mark[v]){
    40             low[u]=min(low[u],dfn[v]);
    41             if(!vis[u][v]){
    42                 bridge.push_back(make_pair(u,v));
    43                 vis[u][v]=vis[v][u]=true;
    44             }
    45         }
    46     }
    47 }
    48 
    49 int main()
    50 {
    51     int u,v,t=1;
    52     while(~scanf("%d%d",&n,&m)){
    53         if(n==0&&m==0)break;
    54         for(int i=0;i<=n+1;i++)g[i].clear();
    55         bridge.clear();
    56         while(m--){
    57             scanf("%d%d",&u,&v);
    58             g[u].push_back(v);
    59             g[v].push_back(u);
    60         }
    61         memset(mark,false,sizeof(mark));
    62         memset(dfn,0,sizeof(dfn));
    63         memset(vis,false,sizeof(vis));
    64         _count=cnt=0;
    65         Tarjan(1,-1);
    66         printf("%d
    
    ",t++);
    67         for(int i=0;i<(int)bridge.size();i++){
    68             printf("%d %d
    ",bridge[i].first,bridge[i].second);
    69         }
    70         puts("#");
    71     }
    72     return 0;
    73 }
    74 
    75 
    76 
    77 
    78 
    79 
    80 
    81 
    82 
    83         
    View Code
  • 相关阅读:
    ShellExecuteEx 函数说明
    npm
    Byte和char
    如何高效阅读一个项目
    C++中慎用malloc
    #ifdef
    string
    C++与C混合编译
    git@github.com: Permission denied (publickey).
    connect to host github.com port 22: Connection refused
  • 原文地址:https://www.cnblogs.com/wally/p/3322177.html
Copyright © 2011-2022 走看看