uva 10972 RevolC FaeLoN (双连通分量)
2014-11-05 20:20
246 查看
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=54643#problem/H
题意:一个无向图要添加多少条边才能使其变为边双连通分量
思路:可以将缩点后的图画出,用类似欧拉回路的思想求解,如果某点度数为1(叶子点),那么ans + 1, 如果是孤立点,那么ans + 2, 最后的结果便是 (ans + 1) / 2 (加一为了向上取整),如果一开始本图就是强联通分量,那就输出0
题意:一个无向图要添加多少条边才能使其变为边双连通分量
思路:可以将缩点后的图画出,用类似欧拉回路的思想求解,如果某点度数为1(叶子点),那么ans + 1, 如果是孤立点,那么ans + 2, 最后的结果便是 (ans + 1) / 2 (加一为了向上取整),如果一开始本图就是强联通分量,那就输出0
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <vector> #include <utility> #include <algorithm> using namespace std; const int N = 2020; int n, tot; int dfn , low , ins , belong , de , dcnt, bcnt; vector <int> e ; stack <int> sta; typedef pair <int, int> P; vector <P> bridge; void init() { dcnt = bcnt = 0; while(!sta.empty()) sta.pop(); bridge.clear(); for(int i = 1; i <= n; i++) { dfn[i] = 0; e[i].clear(); ins[i] = de[i] = 0; } } void dfs(int u , int fa) { sta.push(u); ins[u] = true; dfn[u] = low[u] = ++dcnt; for(int i = 0; i < e[u].size(); i++) { int v = e[u][i]; if(v == fa) continue; if(!dfn[v]) //树边 { dfs(v, u); low[u] = min(low[u] , low[v]); if(low[v] > dfn[u]) //桥 { bridge.push_back(make_pair(u, v)); ++bcnt; while(true) { int x = sta.top(); sta.pop(); ins[x] = 0; belong[x] = bcnt; if(x == v) break; } } } else if(ins[v]) //后向边 low[u] = min(low[u] , dfn[v]); } } void solve() { for(int i = 1; i <= n; i++) if(!dfn[i]) { dfs(i, -1); bcnt++; while(!sta.empty()) { int x = sta.top(); sta.pop(); ins[x] = 0; belong[x] = bcnt; if(x == i) break; } } if(bcnt == 1) { cout << 0 << endl; return ; } for(int i = 0; i < bridge.size(); i++) //取出所有的桥 { int u = bridge[i].first; int v = bridge[i].second; de[belong[u]]++; de[belong[v]]++; } int res = 0; for(int i = 1; i <= bcnt; i++) if(de[i] == 0) res += 2; else if(de[i] == 1) res++; cout << (res + 1) / 2 << endl; } int main() { while(cin >> n >> tot) { init(); while(tot--) { int u, v; cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } solve(); } return 0; }
相关文章推荐
- UVA10972 - RevolC FaeLoN(双连通分量)
- UVA10972 - RevolC FaeLoN(双连通分量)
- Uva 10972 RevolC FaeLoN(边双连通分量)
- UVA 10972 - RevolC FaeLoN(边-双连通分量)
- uva 10972 - RevolC FaeLoN(边双连通分量)
- UVA-10972 - RevolC FaeLoN(边双连通分量)
- UVA 10972 - RevolC FaeLoN(边-双连通分量)
- UVA 10972 RevolC FaeLoN(边-双连通+缩点)
- UVA 10972 RevolC FaeLoN(边连通分量)
- 【RevolC FaeLoN Uva 10972】
- uva 10972 RevolC FaeLoN cdoj 方老师和农场
- RevolC FaeLoN UVA - 10972
- UVA -- 10972 RevolC FaeLoN(边双连通)
- UVA 10972 RevolC FaeLoN(边双联通+缩点)
- Uva10972(RevolC FaeLoN)
- uva 10972 - RevolC FaeLoN(双联通)
- UVA 10972 RevolC FaeLoN(边-双连通+缩点)
- uva 10972(边双连通分量)
- UVA - 10972 RevolC FaeLoN (边双连通分量)
- UVA 10972(边双连通分量)