RevolC FaeLoN
题意:给一个无向图,现在要将所有的边变成有向,问至少还需要建几条边才能使得图强连通。
新的有向图强连通等价于原图边双连通。
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 }