POJ3177 && POJ3352_加最好的边构成双连通图
2012-08-16 08:40
295 查看
/* *State: POJ3177 Accepted 340K 16MS C++ 1877B *题目大意: * 给出一个无向连通图,判断最少需要加多少条边,才能使得 * 任意两点之间至少有两条相互"边独立"的道路.注意,可能 * 含有重边. *解题思路: * 先缩点,之后形成一棵树,然后求(叶子节点数量+1)/ 2即可。 */
View Code
#include <iostream> #include <vector> #include <stack> using namespace std; const int MAXN = 1005; vector<int> vec[MAXN]; stack<int> S; int dfn[MAXN], low[MAXN], step; int id[MAXN], scc; void init() { while(!S.empty()) S.pop(); step = 0; scc = 1; for(int i = 0; i < MAXN; i++) { id[i] = -1; vec[i].clear(); dfn[i] = low[i] = -1; } } void addEdge(int u, int v) { vec[u].push_back(v); vec[v].push_back(u); } void tarjan_scc(int n, int father) { dfn = low = ++step; S.push(n); int flag = 0; for(unsigned i = 0; i < vec .size(); i++) { int son = vec [i]; if(son == father && !flag) { flag = 1; continue; } if(dfn[son] == -1) { tarjan_scc(son, n); low = min(low , low[son]); } else low = min(low , dfn[son]); } if(low == dfn ) { int tmp; do { tmp = S.top(); id[tmp] = scc; // cout << tmp << " "; S.pop(); }while(!S.empty() && tmp != n); scc++; //cout << endl << "---------------" << endl; } } void deal_scc(int n, int &sol) { int u, v; int du[MAXN] = {0}; for(int i = 1; i <= n; i++) { for(unsigned j = 0; j < vec[i].size(); j++) { u = i, v = vec[i][j]; if(id[u] == id[v]) continue; else { du[id[v]]++; du[id[u]]++; } } } int sum = 0; for(int i = 1; i < scc; i++) { if(du[i] == 2) sum++; } sum++; sol = sum / 2; } int main(void) { #ifndef ONLINE_JUDGE freopen("in3352.txt", "r", stdin); #endif int n, m; while(scanf("%d %d", &n, &m) == 2) { init(); int u, v; for(int i = 0; i < m; i++) { scanf("%d %d", &u, &v); addEdge(u, v); } tarjan_scc(1, 1); int sol; deal_scc(n, sol); printf("%d\n", sol); //cout << "****************" << endl; } return 0; }
相关文章推荐
- POJ3177 POJ3352 加最少的边构成双连通图
- poj3177 Redundant Paths && poj3352 Road Construction
- poj3177 && poj3352 边双连通分量缩点
- 最好用的web编辑器 KindEditor 在…
- 一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。 小王对既是素数又是回文的
- "世界最好工作"候选人公布 3名中国人入选前50
- SMT离线编程软件,SMT编程软件,最专业的SMT编程软件,首选JDS,smt... SMTI离线编程软件:适用于所有 SMT & AI 设备。JDS编程软件是目前最专业最好用的SMT编程软件,具有“
- 比尔·盖茨:大家最好读读这六本书
- 程序员开发学习利器篇(下)之文档&资料&软件-获取他们的最好途径
- 30个最好的jQuery 灯箱插件 &lt;转&gt;
- int( (LONG)(LONG_PTR)&(((type *)0)->field))的最好解释
- iOS获得当前设备的IP最方便最好的方法 (分IPv4 & IPv6)
- 2017暑假集训 div1 连通图(1) POJ3694 &&POJ3177
- "世界最好工作"候选人公布 3名中国人入选前50
- 最好免费的 HTML5 & JS 网站视频播放器收集
- NYOJ 1099 Lan Xiang's Square(给出四点判断是否能构成正方形)
- 什么是最好的网站学习&如何使用Linux系统?
- duang~&nbsp;程序员最好关注一下这些事~
- 函数功能:传入一个数组,返回数组中第二大数。已知数组中的对象都是数字构成的字符串,且任意两元素不相等。 如传入:@[@"1",@"2",@"3",@"4"],返回@"3"
- Notepad++使用心得和特色功能介绍 -> notepad/ultraedit的最好的替代品