据说这是一道Word Final的题,Orz。。。

原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3136

题意:

给你一个联通图,让你选择一些点,使得这个图的任意一个点消失后,其余的点都能到达某个你选择的点。问你最少选择哪些点,并且输出在最优的情况下,有多少方案。

题解:

一眼看过去,做法很简单,就删掉所有的割点后,考察联通块的个数就好。但这道题满满的坑。。要不怎么是总决赛的题。。

首先如果这个图只有一个联通块,那么答案就应该是任选两个点,这是因为,如果其中一个点挂了,还能走另外一个点。

如果一个联通块有大于一个割点,那么这个联通块就不需要,这是因为两个割点不可能同时挂了。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#define MAX_V 50004
using namespace std;int V=0;
vector<int> G[MAX_V];
int N;int dfn[MAX_V],low[MAX_V],ind=0;
bool vis[MAX_V];
bool isCut[MAX_V];
int tot=0;long long ways=1;
long long tmp=0;
long long cnt=0;bool used[MAX_V];
set<int> se;void init(){se.clear();V=ind=cnt=tmp=0;ways=1;memset(used,0,sizeof(used));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(vis,0,sizeof(vis));memset(isCut,0,sizeof(isCut));for(int i=0;i<=N+2;i++)G[i].clear();
}void Tarjan(int u,int p) {dfn[u] = low[u] = ++ind;vis[u]=1;int child = 0;for (int i = 0; i < G[u].size(); i++) {int v = G[u][i];if (v == p)continue;if (!vis[v]) {child++;Tarjan(v, u);low[u] = min(low[v], low[u]);if (p == 0 && child > 1)isCut[u] = 1;if (p&&low[v] >= dfn[u])isCut[u] = 1;tot+=isCut[u];}elselow[u] = min(dfn[v], low[u]);}
}void dfs(int u) {if (used[u] || isCut[u])return;tmp++;used[u] = 1;for (int i = 0; i < G[u].size(); i++){int v=G[u][i];if(isCut[v]){se.insert(v);continue;}dfs(v);}
}int main() {int cas = 0;cin.sync_with_stdio(false);while (cin >> N) {tot=0;if (N == 0)break;init();for (int i = 0; i < N; i++) {int u, v;cin >> u >> v;V = max(V, max(u, v));G[u].push_back(v);G[v].push_back(u);}Tarjan(1, 0);cout << "Case " << ++cas << ": ";if (tot == 0) {cout << 2 << " " << (long long)V * (V - 1) / 2 << endl;continue;}for (int u = 1; u <= V; u++) {if (isCut[u])continue;tmp = 0;if (!used[u]) {se.clear();dfs(u);if (se.size() == 1 && tmp) {ways *= tmp;cnt++;}}}cout << cnt << " " << ways << endl;}return 0;
}

转载于:https://www.cnblogs.com/HarryGuo2012/p/4791057.html

UVALive 5135 Mining Your Own Business 双连通分量相关推荐

  1. UVALive 5135 Mining Your Own Bussiness【tarjan点双】

    LINK1 LINK2 题目大意 给你一个无向连通图,让你给一些点染上黑色,需要满足染色之后,断开任意一个节点,要满足任意一个联通块中剩下的节点中至少有一个黑点 思路 一开始想的是把每一个点双联通分量 ...

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

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

  3. UVA1108 Mining Your Own Business(思维、割点)(2011 ICPC - WorldFinal)

    整理的算法模板合集: ACM模板 UVA1108 Mining Your Own Business 如果将割点涂黑是不划算的,因为这样的话如果割点倒塌之后,那么这个割点的点双连通分量之中的所有点都没了 ...

  4. 双连通分量的题目列表(一)

    双连通分量:定义:给一个无向图,其中的极大子图中的每个点两两可达,那么就说明这个是一个双连通分量. 点双连通:如果任意两点至少存在两条点不重复的路径,则说明这个图是点双连通. 点双连通的一些特点 ①每 ...

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

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

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

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

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

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

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

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

  9. UVA 610 Street Directions 双连通分量

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

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

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

最新文章

  1. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
  2. 远程计算机无法操作,Win10系统下qq远程不能控制对方电脑(点不动)的完全解决方法...
  3. SpringMVC注解@RequestParam(value=xxxx,required=false)解释
  4. select可选择、同时可自行输入
  5. (React 框架)React技术
  6. MySQL令人头疼的Aborted告警案例分析
  7. 特征工程(part3)--扁平化、过滤和分块
  8. 【Aladdin Unity3D Shader编程】之三 光照模型(二)
  9. pip和conda的区别【转载】
  10. 2月11日 TensorBoard+DNN+CNN
  11. 贝叶斯网络(Belief Networks)--模型及方法
  12. 微信内置浏览器 用 JS 调用微信APP分享到微信朋友圈
  13. flink实战-实时计算平台通过api停止流任务
  14. 英语六级口语 计算机,英语六级口语
  15. android 中角度计算
  16. 医学影像开源数据集汇总
  17. 10.发布者Publisher的编程实现
  18. 编程题-有n步台阶一次只能上1步或2步共有多少种走法
  19. php交易商城项目源代码,PHP源码交易商城网站整站源码(商业运行版)
  20. 假如我国国民生产总值的年增长率为7%,计算10年后我国国民生产总值与现在相比增长多少百分比

热门文章

  1. asp.net 页面ajax访问被阻塞
  2. Xcode Missing Private key
  3. 201809-1 卖菜
  4. IDEA创建maven项目之后无法编写java类
  5. Java中设计模式之装饰者模式-3
  6. leetcode 221. Maximal Square 求一个数组中由1组成的最大的正方形面积 ---------- java...
  7. (摘录)Linux如何去学、要学什么、又怎样才能学好
  8. SQL多表连接查询时间最新的
  9. XAMPP mysql远程连接
  10. 几个C#控件出现闪烁的问题的解决方案(转)