一个公园中有 n 个景点,景点之间通过无向的道路来连接,如果至少两个环公用一条路,路上的游客就会发生冲突;如果一条路不属于任何的环,这条路就没必要修

问,有多少路不必修,有多少路会发生冲突

每一个连通块中,如果边数大于点数,这个块中所有的边全部是冲突边。

所有桥为不需要修建的路。

通过这题学习点的双连通分量怎么求。强连通和双连通的题就做到这吧。

#include <bits/stdc++.h>
using namespace std;const int M = 200010;
const int N = 10010;struct Edge {int from, to;int next;
} edge[M];
int head[N];
int cnt_edge;
void add_edge(int u, int v)
{edge[cnt_edge].from = u;edge[cnt_edge].to = v;edge[cnt_edge].next = head[u];head[u] = cnt_edge++;
}int dfn[N]; int idx;
int low[N];
stack<Edge> stk;
set<int> bcc;
int cut;    // 桥的数量
int ans;    // 冲突边数量
int m, n;void dfs(int u, int pre)
{dfn[u] = low[u] = ++idx;for (int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if (v == pre) continue;if (!dfn[v]){stk.push(edge[i]);dfs(v, u);low[u] = min(low[u], low[v]);if (low[v] >= dfn[u])       // 割点{Edge tmp;int cnt = 0;bcc.clear();do {cnt++;tmp = stk.top();stk.pop();bcc.insert(tmp.from);bcc.insert(tmp.to);} while (tmp.from != u || tmp.to != v);if (cnt > bcc.size()) ans += cnt;}if (low[v] > dfn[u]) ++cut;}else if (dfn[v] < dfn[u]){stk.push(edge[i]);low[u] = min(low[u], dfn[v]);}}
}void init()
{memset(head, -1, sizeof head);memset(dfn, 0, sizeof dfn);ans = cut = cnt_edge = idx = 0;
}int main()
{while (~scanf("%d%d", &n, &m)){if (n == 0 && m == 0) break;int u, v;init();for (int i = 0; i < m; ++i){scanf("%d%d", &u, &v);add_edge(u, v);add_edge(v, u);}for (int i = 1; i <= n; ++i)if (!dfn[i]) dfs(i, -1);printf("%d %d\n", cut, ans);}return 0;
}

  

转载于:https://www.cnblogs.com/wenruo/p/5008312.html

hdu3394--Railway(点的双连通分量)相关推荐

  1. 【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)

    题干: There are some locations in a park, and some of them are connected by roads. The park manger nee ...

  2. HDU 3394 Railway(点双连通分量)

    题目大意 一个公园中有 n 个景点,景点之间通过无向的道路来连接,如果至少两个环公用一条路,路上的游客就会发生冲突:如果一条路不属于任何的环,这条路就没必要修 问,有多少路不必修,有多少路会发生冲突 ...

  3. Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...

    转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...

  4. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)

    整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...

  5. UVA1364 Knights of the Round Table(双连通分量、二分图染色,超详细解释)

    整理的算法模板合集: ACM模板 UVA1364 Knights of the Round Table 题目中要求互相有憎恨关系的人不能坐在相邻的位置,一个圆桌可以很形象地看作是一个环,也就是说我们两 ...

  6. 【图论专题】无向图的双连通分量

    A.AcWing 395. 冗余路径 结论:变成边双连通分量所需要新建的边数 无向图 连多少条边使得整个无向图变成任意两个点之间都有两条完全不相同的路径. 结论1:任意两个点之间都有两条完全不相同的路 ...

  7. Uvalive 3523 - Knights of the Round Table (双连通分量+二分图)

    题目链接 https://vjudge.net/problem/UVALive-3523 [题意] 有n个骑士经常举行圆桌会议,每次圆桌会议应至少有3个人参加且人数必须是奇数,相互憎恨的骑士不能坐在圆 ...

  8. UVA 610 Street Directions 双连通分量

    首先找到全部双连通分量,然后对于某一个结点数大于2的连通分量,可以把全部的边改成单向的,按DFS的顺序. 结点数为2的也就是一条为桥的边,必须保持双向. //#pragma comment(linke ...

  9. [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)

    [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...

  10. poj 3352 双连通分量

    至少加几条边成为双连通分量 #include <iostream> #include <cstdio> #include <cstring> using names ...

最新文章

  1. python代码规范快捷键_pycharm格式化代码 常用快捷键
  2. 关于instancetype代替id的使用区别
  3. 反思快乐:融入 真实 不回忆 聪明应对
  4. 秒杀多线程第十二篇 多线程同步内功心法——PV操作上
  5. eclipse 与 tomcat 的那些路径
  6. 企业利用Pinterest平台推广9条建议
  7. wordpress用cdn_如何为WordPress创建自己的自托管CDN
  8. java 基础知识学习 内存泄露(memory leak) VS 内存溢出(out of memory)以及内存管理...
  9. 题目1012:畅通工程(并查集)
  10. vi 方向键 ABC
  11. This iPhone 6s is running iOS 11.3.1 (15E302), which may not be supported by this version of Xcode.
  12. 几种常见模式识别算法整理和总结【转】
  13. 互联网IT工程师需要具备哪些技能?
  14. 新型的铁塔基站“能源管家”
  15. 【机器学习】朴素贝叶斯对文本分类--对人名国别分类
  16. win7如何安装IIS,三种方法任你选(图文教程)
  17. 《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第10章 维度设计
  18. FPGA实战篇——【2】按键控制LED灯闪烁
  19. set的用法及短语_set的用法总结大全
  20. 使用Feign实现Form表单提交

热门文章

  1. php 无符号位移怎么使用,,(有符号位移)和(无符号位移)的使用方法,及差别...
  2. idea 自动添加doc_公共组件需求自动录入TAPD
  3. 极大似然估计与贝叶斯估计的比较
  4. C# 如何在PDF中绘制不同风格类型的文本
  5. opencv读取摄像头实时流代码
  6. linux软件包管理rpm
  7. Linux 查看 硬件配置
  8. android 界面布局
  9. OpenStack Compute(Nova)功能分析
  10. java调用python脚本并向python脚本传递参数