zoukankan      html  css  js  c++  java
  • RevolC FaeLoN UVA

    RevolC FaeLoN

     UVA - 10972 

    题意:给一个无向图,现在要将所有的边变成有向,问至少还需要建几条边才能使得图强连通。

    新的有向图强连通等价于原图边双连通。

     1 /*************************************************************************
     2   > File Name: bb.cpp
     3   > Author: yijiull
     4   > Mail: 1147161372@qq.com 
     5   > Created Time: 2017年11月19日 星期三 21时10分33秒
     6  ************************************************************************/
     7 #include <bits/stdc++.h>
     8 using namespace std;
     9 const int maxv = 1010;
    10 const int maxe = 1000010;
    11 
    12 struct Edge{
    13     int  u, v, nxt;
    14     int iscut;
    15     Edge(int u = 0, int v = 0, int nxt = 0, int iscut = 0) : u(u), v(v), nxt(nxt), iscut(iscut){}
    16 }e[maxe<<1];
    17 int cnt;
    18 int head[maxv];
    19 void init(){
    20     cnt = 0;
    21     memset(head, -1, sizeof(head));
    22 }
    23 void add(int u, int v){
    24     e[cnt] = Edge(u, v, head[u]);
    25     head[u] = cnt++;
    26     e[cnt] = Edge(v, u, head[v]);
    27     head[v] = cnt++;
    28 }
    29 
    30 int pre[maxv], low[maxv], vis[maxv];
    31 int dfsk, bcc_cnt;
    32 int bccno[maxv];
    33 void dfs(int u, int id){
    34     low[u] = pre[u] = ++dfsk;
    35     for(int i = head[u]; ~i; i = e[i].nxt){
    36         if(i == (id ^ 1)) continue;
    37         int v = e[i].v;
    38         if(!pre[v]){
    39             dfs(v, i);
    40             low[u] = min(low[v], low[u]);
    41             if(low[v] > pre[u]) e[i].iscut = e[i ^ 1].iscut = 1;
    42         }else low[u] = min(low[u], pre[v]);
    43     }
    44 }
    45 void dfs1(int u){
    46     vis[u] = 1;
    47     bccno[u] = bcc_cnt;
    48     for(int i = head[u]; ~i; i = e[i].nxt){
    49         if(e[i].iscut) continue;
    50         if(!vis[e[i].v]) dfs1(e[i].v);
    51     }
    52 }
    53 void find_bcc(int n){
    54     memset(vis, 0, sizeof(vis));
    55     memset(pre, 0, sizeof(pre));
    56     dfsk = bcc_cnt = 0;
    57     for(int i = 0; i < n; i++) if(!pre[i]) dfs(i, -1);
    58     for(int i = 0; i < n; i++) if(!vis[i]) bcc_cnt++, dfs1(i);
    59 }
    60 
    61 int deg[maxv];
    62 int main(){
    63     int n, m;
    64     //freopen("in.txt", "r", stdin);
    65     while(scanf("%d %d", &n, &m) != EOF){
    66         init();
    67         int u, v;
    68         for(int i = 0; i < m; i++){
    69             scanf("%d %d", &u, &v);
    70             u--; v--;
    71             add(u, v);
    72         }
    73         find_bcc(n);
    74         memset(deg, 0, sizeof(deg));
    75         for(int u = 0; u < n; u++){
    76             for(int i = head[u]; ~i; i = e[i].nxt){
    77                 int v = e[i].v;
    78                 if(bccno[u] != bccno[v]) {
    79                     //deg[bccno[u]]++;
    80                     deg[bccno[v]]++;
    81                 }
    82             }
    83         }
    84         if(bcc_cnt == 1) {
    85             puts("0");
    86             continue;
    87         }
    88         int a = 0, b = 0;
    89         for(int i = 1; i <= bcc_cnt; i++){
    90             if(deg[i] == 0) a++;
    91             if(deg[i] == 1) b++;
    92         }
    93         //cout<<a<<" "<<b<<endl;
    94         printf("%d
    ", a + (b + 1) / 2);
    95     }
    96 }
    View Code
  • 相关阅读:
    LeetCode题解之Flipping an Image
    LeetCode 之Find Minimum in Rotated Sorted Array
    LeetCode题解Transpose Matrix
    LeetCode 题解之Minimum Index Sum of Two Lists
    LeetCode题解之Intersection of Two Linked Lists
    LeetCode 题解之Add Two Numbers II
    LeetCode题解之Add two numbers
    href="#"与href="javascript:void(0)"的区别
    有关ie9 以下不支持placeholder属性以及获得焦点placeholder的移除
    ie7下属性书写不规范造成的easyui 弹窗布局紊乱
  • 原文地址:https://www.cnblogs.com/yijiull/p/7862304.html
Copyright © 2011-2022 走看看