RevolC FaeLoN UVA - 10972

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\n", a + (b + 1) / 2);
95     }
96 }
View Code

 

posted @ 2017-11-19 21:48  yijiull  阅读(143)  评论(0编辑  收藏  举报