poj3352 Road Construction 缩点
2016-04-13 21:15
281 查看
以下内容为个人理解,有错误地方还请指出。
有时根据问题的需要,要把边双连通分量抽象为一个点,这就叫缩点。
缩点的根据也是low值;同一边双连通分量的点,low值相同,因为对于该边双连通分量dfs树上的根节点u和其子孙节点v,它们之间除了有一条dfs树边组成的路径之外,肯定还有一条包含回边的路径,所以每个点v都能通过一条非dfs树上的路径到达u点,即所有的low[v]=u;
经过缩点后的无向图是一棵树(树的每一条边都是割边),使这棵树变成双连通分量至少需要添加的边的条数==(树的叶子节点+1)×2;
有时根据问题的需要,要把边双连通分量抽象为一个点,这就叫缩点。
缩点的根据也是low值;同一边双连通分量的点,low值相同,因为对于该边双连通分量dfs树上的根节点u和其子孙节点v,它们之间除了有一条dfs树边组成的路径之外,肯定还有一条包含回边的路径,所以每个点v都能通过一条非dfs树上的路径到达u点,即所有的low[v]=u;
经过缩点后的无向图是一棵树(树的每一条边都是割边),使这棵树变成双连通分量至少需要添加的边的条数==(树的叶子节点+1)×2;
Poj3352 Road Construction 一个连通的无向图,求至少需要添加几条边,原图变为边双联通图; class POJ_3352 { private: int n, r; vector<int> head[maxn]; int dfn[maxn]; //dfs序,-1表示未遍历,省去vis数组 int depth; //当前dfs序 int low[maxn]; int deg[maxn]; int root; public: void ini(); void action(); void tarjan(int rt, int father); int min_add(); }; void POJ_3352::ini() { memset(dfn, -1, sizeof(dfn)); memset(low, -1, sizeof(low)); depth = 1; } void POJ_3352::action() { ini(); scanf("%d%d", &n, &r);//点,边数量 for (int i = 0; i < r; ++i) { int u, v; scanf("%d%d", &u, &v); head[u].push_back(v); head[v].push_back(u); } root = 1; tarjan(1, 1); printf("%d\n", min_add()); } void POJ_3352::tarjan(int rt, int father) { dfn[rt] = low[rt] = depth++; for (int i = 0, len = head[rt].size(); i < len; ++i) { int v = head[rt][i]; if (dfn[v] == -1) { tarjan(v, rt); low[rt] = min(low[rt], low[v]); } else if (v != father) low[rt] = min(low[rt], dfn[v]); } } int POJ_3352::min_add() { mem(deg); for (int u = 1; u <= n; ++u) { for (int j = 0, len = head[u].size(); j < len; ++j) { int v = head[u][j]; if (low[u] != low[v])//如果u,v有边,但是low值不一样,则(u,v)是割边 { deg[low[u]]++; deg[low[v]]++; } } } int ans = 0; for (int i = 1; i <= n; ++i) { if (deg[i] / 2 == 1) ans++; } return (ans + 1) / 2; } int main() { POJ_3352 ans; ans.action(); }
相关文章推荐
- 数据结构实验之二叉树四:还原二叉树
- Redis+linux的Bundle池化(四)
- 数据挖掘简要介绍
- Swift TextField
- ajax解决中文数据乱码问题
- spring-hibernate-Junit4测试心得
- 结对编程 黄金分割
- 利用gson将JSON格式转为Map
- 浏览器同源策略及其规避方法
- Python模块受欢迎排行榜Top200
- Extjs MVC开发模式详解
- 指针
- BaseAdapter的使用以及优化
- Linux哲学思想
- 字符集&各种编码&编码解码
- 一个时间的扩展函数帮助类
- LeetCode(52)-Remove Linked List Elements
- python文件操作
- LeetCode(52)-Remove Linked List Elements
- LeetCode(52)-Remove Linked List Elements