UVAlive5135 Mining Your Own Business(bcc)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19845

【思路】

点-双连通分量。

求出bcc,对于每个bcc而言,最优的方案就是在每一个只有一个割点的bcc中安置一个逃生装置。

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<stack>
 4 #include<vector>
 5 #include<iostream>
 6 #include<cstdlib>
 7 #define FOR(a,b,c) for(int a=(b);a<(c);a++)
 8 using namespace std;
 9
10 typedef long long LL;
11 const int maxn = 100000+10;
12
13 struct Edge{ int u,v;
14 };
15
16 int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;
17 vector<int> G[maxn],bcc[maxn];
18
19 stack<Edge> S;
20
21 int dfs(int u,int fa) {
22     int lowu=pre[u]=++dfs_clock;
23     int ch=0;
24     for(int i=0;i<G[u].size();i++) {
25         int v=G[u][i];
26         Edge e=(Edge) {u,v};
27         if(!pre[v]) {
28             S.push(e);
29             ch++;
30             int lowv=dfs(v,u);
31             lowu=min(lowu,lowv);
32             if(lowv>=pre[u]) {
33                 iscut[u]=1;
34                 bcc_cnt++; bcc[bcc_cnt].clear();
35                 for(;;) {
36                     Edge x=S.top(); S.pop();
37                     if(bccno[x.u]!=bcc_cnt) bcc[bcc_cnt].push_back(x.u),bccno[x.u]=bcc_cnt;
38                     if(bccno[x.v]!=bcc_cnt) bcc[bcc_cnt].push_back(x.v),bccno[x.v]=bcc_cnt;
39                     if(x.u==u && x.v==v) break;
40                 }
41             }
42         }
43         else if(pre[v]<pre[u] && v!=fa) {
44             S.push(e);  lowu=min(lowu,pre[v]);
45         }
46     }
47     if(fa<0 && ch==1) iscut[u]=0;
48     return lowu;
49 }
50 void find_bcc(int n) {
51     memset(pre,0,sizeof(pre));
52     memset(iscut,0,sizeof(iscut));
53     memset(bccno,0,sizeof(bccno));
54     dfs_clock=bcc_cnt=0;
55     for(int i=0;i<n;i++)
56         if(!pre[i]) dfs(i,-1);
57 }
58
59 int n,m,kase;
60
61 int main() {
62     while(scanf("%d",&m) && m) {
63         int u,v;
64         n=0;
65         for(int i=0;i<2*m;i++) G[i].clear();
66         for(int i=0;i<m;i++) {
67             scanf("%d%d",&u,&v);
68             u--,v--;
69             n=max(n,max(u,v));
70             G[u].push_back(v);
71             G[v].push_back(u);
72         }
73         while(!S.empty()) S.pop();
74
75         find_bcc(n);
76
77         LL ans1=0,ans2=1;
78         for(int i=1;i<=bcc_cnt;i++) {
79             int cnt=0;
80             for(int j=0;j<bcc[i].size();j++)
81                 if(iscut[bcc[i][j]]) cnt++;
82             if(cnt==1) {
83                 ans1++; ans2*=(long long)(bcc[i].size()-1);
84             }
85         }
86         if(bcc_cnt==1) {
87             ans1=2; ans2=bcc[1].size()*(bcc[1].size()-1)/2;
88         }
89         printf("Case %d: %lld %lld\n",++kase,ans1,ans2);
90     }
91     return 0;
92 }
时间: 2024-10-13 17:48:04

UVAlive5135 Mining Your Own Business(bcc)的相关文章

UVALive-5135 Mining Your Own Business (无向图的双连通分量)

题目分析:在一张无向图中,将一些点涂上黑色,使得删掉图中任何一个点时,每个连通分量至少有一个黑点.问最少能涂几个黑点,并且在涂最少的情况下有几种方案. 题目分析:显然,一定不能涂割点.对于每一个连通分量,如果有1个割点,则必须涂上分量内除割点之外的任意一个点,如果有多个(2个及以上)割点,则这个分量不需要涂色.如果整张图都没有割点,那么任选两个点涂色即可,之所以要涂两个,是要防止删掉的电恰是黑点的情况. 代码如下: # include<iostream> # include<cstdio

UVA 1108 - Mining Your Own Business(双连通分量)

UVA 1108 - Mining Your Own Business 题目链接 题意:给定一个连通图,设置一个些安全点,使得其他任意一些节点崩塌后,其他点都能到一个安全点,问安全点最小数量和情况数 思路: #include <cstdio> #include <cstring> #include <vector> #include <stack> #include <map> using namespace std; const int N =

hdu 3844 Mining Your Own Business (点双连通分量)

Mining Your Own Business Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1392    Accepted Submission(s): 219 Problem Description John Digger is the owner of a large illudium phosdex mine. The m

Office 365 轻松上手指南 - OneDrive for Business(三)

2.2. 项目文档协同编辑.文档版本有效管理 2.2.1. 典型需求 当多项任务并行推进时,各部门之间能够实现高效协作.数据实时共享. 出差员工也可以使用多种移动设备参与到项目中,获取最新的项目资料,进行项目文档的多人协同编辑:够对项目文档版本进行有效管理,避免版本混乱,降低产品交付周期.   2.2.2. 应对方案 2.2.2.1. 文档协同编辑 步骤1:在 OneDrive for Business 中打开需要协同编辑的项目文档,然后选择好编辑的方式. 步骤 2: 当需要他人协同编辑时,可直

HDU 3844 Mining Your Own Business(割点,变形,开栈,经典)

题意:给出一个连通图,要求将某些点涂黑,使得无论哪个点(包括相关的边)撤掉后能够成功使得剩下的所有点能够到达任意一个涂黑的点,颜料不多,涂黑的点越少越好,并输出要涂几个点和有多少种涂法. 思路: 要使得任意撤掉一个点都能使其他点能够到达黑点,那么点双连通分量能保证这点,那么就在同个点双连通分量内涂黑1个点.但是每个[点双连通分量]都涂吗?太浪费颜料了,那就缩点成树,只需要涂叶子即可,那就找度为1的缩点.但是种数呢?叶子内的点除了割点外都是可以涂黑的,因为如果黑色割点被撤掉,那么叶子中的其他点怎么

UVALive5135 - Mining Your Own Business(BCC)

题目链接 题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱,求最少安装数量和方案. 思路:其实本题就相当于在一张无向图中,涂尽量少的黑点,使得任意删除哪个点,每个连通分量至少有一个黑点.因为不同的连通分量最多只有一个公共点,那一定是割点.可以发现,涂黑割点是不划算的,而且在一个点-双连通分量中涂黑两个黑点也是不划算的.所以只有当点-双连通分量只有一

豌豆荚研发管理和绩效考虑(转)

虎嗅注:阿里.腾讯以及一些创业公司是如何进行研发管理和绩效考核的?在知乎上,这个问题得到了超过 5000 位网友的关注,显然,BAT 获得的巨大成功使得巨头们的管理模式成为了人们好奇的焦点.豌豆荚创始团队成员丁吉昌这个问题下做了一个豌豆荚研发管理的详细分享.本文已获作者授权. 首先,画一下我们通常讲研发管理的范畴:确定如何立项,如何确定产品目标,如何把控项目进度,如何驱动产品一代代完善以及如何调动团队积极性等. 在时间周期上来说,我们归纳为 5 个关键步骤:选方向.定目标.控进度.带团队和排干扰

Business Intelligence (BI)

BI, 全称Business Inteligence. 帮助企业更有效地利用数据,提供经营决策支持.让决策管理者随时随地获取关键信息,基于数字决策,最终提高决策水平. 包括范围(层次由低到高):数据报表(传统数据报表,心数据报表).OLAP(在线链接分析).数据挖掘.是数据仓库.OLAP和数据挖掘技术的综合应用. BI solution: DB—>ETL—>Data Warehouse—>Data Mining|OLAP —>DataAnalyzing|DataReporting

Skype for Business Server 2015系列(三)部署前端服务器-3

1.创建Skype 拓扑 打开"Skype for Business Server 2015 拓扑生成器" 在 拓扑生成器中,选择"新建拓扑".根据提示输入位置和文件名以保存拓扑.为拓扑文件提供一个的名称,单击[确定],并保持文件的后缀扩展名不变(tbxml). 在"定义主域"页上,为组织输入主 SIP 域的名称,然后单击[下一步]. 在"指定其他支持域"页上,输入其他域的名称(如果有),然后单击[下一步]. 在"定