• 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
  • 相关阅读:
    js 性能调试
    js 面向对象编程
    js 零碎
    如果遇到二维数组 想取某个字段的和
    昨天写支付接口时遇到支付接口返回数据接收地址,session数据丢失(或者说失效)的问题
    mysql报错: 1548-Cannot load from mysql.proc. The table is probably corrupted 解决办法
    php 时间倒计时代码 个人写法 有好的想法的欢迎贴出来分享
    linux 环境下安装mysql5.6
    关于数据库连接不上 出现错误的问题
    推荐一个不错的css3网站 可以直接调用的
  • 原文地址:https://www.cnblogs.com/yijiull/p/7862304.html
Copyright © 2020-2023  润新知