UVALive 5135 Mining Your Own Business 双连通分量 2011final
题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点。任意两个连接点之间最多只有一条隧道。任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱,求最少安装数量和方案。
思路:其实本题就相当于在一张无向图中,涂尽量少的黑点,使得任意删除哪个点,每个连通分量至少有一个黑点。因为不同的连通分量最多只有一个公共点,那一定是割点。可以发现,涂黑割点是不划算的,而且在 一个点-双连通分量中涂黑两个黑点也是不划算的。所以只有当点-双连通分量只有一个割点时,才需要涂,而且是任选一个非割点涂黑。
2011年final题,想法不是很好明白,联系实际再YY一下就懂了
- //struct ID 用来减小数字的,有点离散的作用。但是注释掉以后运行时间简短,AC
- #include<cstdio>
- #include<stack>
- #include<vector>
- #include<map>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- typedef long long LL;
- struct Edge {
- int u, v;
- };
- const int maxn = + ;
- int pre[maxn], iscut[maxn], bccno[maxn], dfs_clock, bcc_cnt; // 割顶的bccno无意义
- vector<int> G[maxn], bcc[maxn];
- stack<Edge> S;
- int dfs(int u, int fa) {
- int lowu = pre[u] = ++dfs_clock;
- int child = ;
- for(int i = ; i < G[u].size(); i++) {
- int v = G[u][i];
- Edge e = (Edge) {
- u, v
- };
- if(!pre[v]) { // 没有访问过v
- S.push(e);
- child++;
- int lowv = dfs(v, u);
- lowu = min(lowu, lowv); // 用后代的low函数更新自己
- if(lowv >= pre[u]) {
- iscut[u] = true;
- bcc_cnt++;
- bcc[bcc_cnt].clear();
- for(;;) {
- Edge x = S.top();
- S.pop();
- if(bccno[x.u] != bcc_cnt) {
- bcc[bcc_cnt].push_back(x.u);
- bccno[x.u] = bcc_cnt;
- }
- if(bccno[x.v] != bcc_cnt) {
- bcc[bcc_cnt].push_back(x.v);
- bccno[x.v] = bcc_cnt;
- }
- if(x.u == u && x.v == v) break;
- }
- }
- } else if(pre[v] < pre[u] && v != fa) {
- S.push(e);
- lowu = min(lowu, pre[v]); // 用反向边更新自己
- }
- }
- if(fa < && child == ) iscut[u] = ;
- return lowu;
- }
- //struct ID {
- // map<int, int> m;
- // int cnt;
- // ID():cnt(0) { }
- // int get(int x) {
- // if(!m.count(x)) m[x] = cnt++;
- // return m[x];
- // }
- //};
- int main() {
- int kase = , n;
- while(scanf("%d", &n) == && n) {
- memset(pre, , sizeof(pre));
- memset(iscut, , sizeof(iscut));
- memset(bccno, , sizeof(bccno));
- for(int i = ; i < n*; i++) G[i].clear();
- dfs_clock = bcc_cnt = ;
- // ID id;
- for(int i = ; i < n; i++) {
- int u, v;
- scanf("%d%d", &u, &v);
- // u = id.get(u);
- // v = id.get(v);
- u--;
- v--;
- G[u].push_back(v);
- G[v].push_back(u);
- }
- dfs(, -); // 调用结束后S保证为空,所以不用清空
- LL ans1 = , ans2 = ;
- for(int i = ; i <= bcc_cnt; i++) {
- int cut_cnt = ;
- for(int j = ; j < bcc[i].size(); j++)
- if(iscut[bcc[i][j]]) cut_cnt++;
- if(cut_cnt == ) {
- ans1++;
- ans2 *= (LL)(bcc[i].size() - cut_cnt);
- }
- }
- if(bcc_cnt == ) {
- ans1 = ;
- ans2 = bcc[].size() * (bcc[].size() - ) / ;
- }
- printf("Case %d: %lld %lld\n", ++kase, ans1, ans2);
- }
- return ;
- }
UVALive 5135 Mining Your Own Business 双连通分量 2011final的更多相关文章
- UVALive 5135 Mining Your Own Business 双连通分量
据说这是一道Word Final的题,Orz... 原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...
- UVALive - 5135 - Mining Your Own Business(双连通分量+思维)
Problem UVALive - 5135 - Mining Your Own Business Time Limit: 5000 mSec Problem Description John D ...
- UVALive - 5135 Mining Your Own Business
刘汝佳白书上面的一道题目:题意是给定一个联通分量,求出割顶以及双连通分量的个数,并且要求出安放安全井的种类数,也就是每个双连通分量中结点数(除开 割顶)个数相乘,对于有2个及以上割顶的双连通分量可以不 ...
- LA 5135 井下矿工(点—双连通分量模板题)
https://vjudge.net/problem/UVALive-5135 题意:在一个无向图上选择尽量少的点涂黑,使得任意删除一个点后,每个连通分量至少有一个黑点. 思路: 首先dfs遍历求出割 ...
- 【LA】5135 Mining Your Own Business
[算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...
- UVALive 5135 Mining Your Own Bussiness【tarjan点双】
LINK1 LINK2 题目大意 给你一个无向连通图,让你给一些点染上黑色,需要满足染色之后,断开任意一个节点,要满足任意一个联通块中剩下的节点中至少有一个黑点 思路 一开始想的是把每一个点双联通分量 ...
- LA 5135 Mining Your Own Business
求出 bcc 后再……根据大白书上的思路即可. 然后我用的是自定义的 stack 类模板: #include<cstdio> #include<cstring> #includ ...
- 训练指南 UVALive - 5135 (双连通分量)
layout: post title: 训练指南 UVALive - 5135 (双连通分量) author: "luowentaoaa" catalog: true mathja ...
- hdu3844 Mining Your Own Business,无向双连接组件
点击打开链接 无向图的双连通分量 #include<cstdio> #include<stack> #include<vector> #include<map ...
随机推荐
- IE 6/7下自赋值导致 overflow 溢出
情景是要限制一个textarea的最大输入字数(100字, 这字数限制也太少了点吧,不大气) 由于限制输入后需要允许 回退,全选等功能键,故放弃keyup, keydown组合 选用property ...
- jdbc 连接Oracle informix Mysql
package com.basicSql; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...
- python 脚本
mag3.py 1,import import sys from org.eclipse.jface.dialogs import MessageDialogfrom org.eclipse.core ...
- CoreBluetooth - TouchID应用
支持系统和机型: iOS系统的指纹识别功能最低支持的机型为iPhone 5s,最低支持系统为iOS 8, 虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论 ...
- Oracle常用查看表结构命令
获取表: select table_name from user_tables; //当前用户的表 select table_name from all_tables; //所有用户的表 select ...
- LFI & RFI & PHP封装协议之安全问题研究
目录 . 文件包含的基本概念 . LFI(Local File Include) . RFI(Remote File Include) . PHP中的封装协议(伪协议).PHP的流式文件操作模式所带来 ...
- HDU 2370 Convert Kilometers to Miles
点我看题目 题意 : 按照题目给定的规则将公里转化成英里,就是每个数都可以用斐波那契数列里的数表示,每个数都有一个编码,21可以表示成(1,0,0,0,0,0,0) ,13可以表示成(1,0,0,0, ...
- [杂题]CSUOJ1274Balls and Boxes
题目链接 题意:中文题 题意不多赘述 值得注意的是n<m 不必考虑n==m的情况 (m是盒子个数, n是每次选取的盒子个数, 不要弄反了!) 这题一看就是同余方程 每次选取n个盒子放球 也就是说 ...
- Android笔记5-与USB HID 设备通信(一)
1.了解 支持USB 主机(host)或者从机(accessary )模式最终是取决于设备的硬件,而与平台版本无关.我们可以通过usesfeature这个方法来查询自己的设备是否支持USB主从. ...
- C# ASP.NET FILEUPLOAD详解
显示一个文本框控件和一个浏览按钮,使用户可以选择要上载到服务器的文件. 命名空间: System.Web.UI.WebControls 程序集: System.Web(在 system.web.dll ...