HDU 3844 Mining Your Own Business
首先,如果图本来就是一个点双联通的(即不存在割点),那么从这个图中选出任意两个点就OK了。
如果这个图存在割点,那么我们把割点拿掉后图就会变得支离破碎了。对于那种只和一个割点相连的块,这个块中至少要选一个点出来建逃生通道,而且可以任意选择,而对于那种和多个割点相连的块则没必要选点出来建逃生通道。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 100010
#define MAXM 100010
#pragma comment(linker, "/STACK:102400000,102400000")
typedef long long LL;
int dfn[MAXN], low[MAXN], h[MAXN], ind;
bool vis[MAXN];
int N, M, first[MAXN], e, next[MAXM], v[MAXM], col[MAXN];
struct Edge
{
int x, y;
}edge[MAXM];
void dfs(int u, int p, int o)
{
dfn[u] = low[u] = ++ ind;
int cnt = ;
for(int i = first[u]; i != -; i = next[i])
{
if(v[i] == p) continue;
if(!dfn[v[i]])
{
++ cnt;
dfs(v[i], u, o);
low[u] = std::min(low[u], low[v[i]]);
if(u == o && cnt > ) h[u] = ;
else if(u != o && low[v[i]] >= dfn[u]) h[u] = ;
}
else low[u] = std::min(low[u], dfn[v[i]]);
}
}
void tarjan()
{
for(int i = ; i <= N; i ++)
low[i] = dfn[i] = h[i] = ;
ind = ;
dfs(i, -, i);
}
void add(int x, int y)
{
v[e] = y;
next[e] = first[x], first[x] = e ++;
}
void input()
{
N = ;
for(int i = ; i < M; i ++)
{
scanf("%d%d", &edge[i].x, &edge[i].y);
N = std::max(edge[i].x, N);
N = std::max(edge[i].y, N);
}
memset(first, -, sizeof(first[]) * (N + )), e = ;
for(int i = ; i < M; i ++)
add(edge[i].x, edge[i].y), add(edge[i].y, edge[i].x);
}
void find(int x, int c, int &pn, int &cn)
{
vis[x] = true, ++ pn;
for(int i = first[x]; i != -; i = next[i])
{
int y = v[i];
if(vis[y]) continue;
if(h[y])
{
if(col[y] != c) col[y] = c, ++ cn;
continue;
}
find(y, c, pn, cn);
}
}
void process()
{
tarjan();
memset(vis, , sizeof(vis[]) * (N + ));
memset(col, , sizeof(col[]) * (N + ));
LL ans = ;
int cnt = ;
for(int i = ; i <= N; i ++)
if(!h[i] && !vis[i])
{
int pn = , cn = ;
find(i, i, pn, cn);
if(cn == ) ans *= (LL)pn * (pn - ) / , cnt += ;
else if(cn == ) ans *= pn, ++ cnt;
}
printf("%d %I64d\n", cnt, ans);
}
int main()
{
int t = ;
while(scanf("%d", &M), M > )
{
input();
printf("Case %d: ", ++ t);
process();
}
return ;
}
HDU 3844 Mining Your Own Business的更多相关文章
- HDU 3844 Mining Your Own Business(割点,经典)
题意: 给出一个连通图,要求将某些点涂黑,使得无论哪个点(包括相关的边)撤掉后能够成功使得剩下的所有点能够到达任意一个涂黑的点,颜料不多,涂黑的点越少越好,并输出要涂几个点和有多少种涂法. 思路: 要 ...
- UVALive - 5135 - Mining Your Own Business(双连通分量+思维)
Problem UVALive - 5135 - Mining Your Own Business Time Limit: 5000 mSec Problem Description John D ...
- HDU3844 Mining Your Own Business
HDU3844 Mining Your Own Business 问题描述John Digger是一个大型illudium phosdex矿的所有者.该矿山由一系列隧道组成,这些隧道在各个大型交叉口相 ...
- 「题解报告」SP16185 Mining your own business
题解 SP16185 Mining your own business 原题传送门 题意 给你一个无向图,求至少安装多少个太平井,才能使不管那个点封闭,其他点都可以与有太平井的点联通. 题解 其他题解 ...
- 【转载】【最短路Floyd+KM 最佳匹配】hdu 2448 Mining Station on the Sea
Mining Station on the Sea Problem Description The ocean is a treasure house of resources and the dev ...
- UVA5135 Mining Your Own Business ( 无向图双连通分量)
题目链接 题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太 ...
- LA 5135 Mining Your Own Business
求出 bcc 后再……根据大白书上的思路即可. 然后我用的是自定义的 stack 类模板: #include<cstdio> #include<cstring> #includ ...
- UVA 1108 - Mining Your Own Business
刘汝佳书上都给出了完整的代码 在这里理一下思路: 由题意知肯定存在一个或者多个双连通分量: 假设某一个双连通分量有割顶.那太平井一定不能打在割顶上. 而是选择割顶之外的随意一个点: 假设没有割顶,则要 ...
- UVALive - 5135 Mining Your Own Business
刘汝佳白书上面的一道题目:题意是给定一个联通分量,求出割顶以及双连通分量的个数,并且要求出安放安全井的种类数,也就是每个双连通分量中结点数(除开 割顶)个数相乘,对于有2个及以上割顶的双连通分量可以不 ...
随机推荐
- Frament 方法
public final boolean isAdded() 如果该Fragment对象被添加到了它的Activity中,那么它返回true,否则返回false. public final boole ...
- cach
为程序使用内存缓存(MemoryCache) oscache Guava cache 一种解决方法是配一个listener,在里面启动定时器. 简单缓存可以封装LinkedHashMap,因为它是有顺 ...
- 【动态规划】bzoj1664 [Usaco2006 Open]County Fair Events 参加节日庆祝
将区间按左端点排序. f(i)=max{f(j)+1}(p[j].x+p[j].y<=p[i].x && j<i) #include<cstdio> #incl ...
- Valid Sudoku leetcode
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析
今天学习了scala的界定,先来看看下面这段代码 //class Pair[T] (val first : T,val second : T)class Pair[T <: Comparable ...
- Spring <context:annotation-config/> 解说
在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredA ...
- 【转发】Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on
当您试图从单独的线程更新一个win form时,您将得到如下错误信息: "Cross-thread operation not valid: Control 'progressBar1' ...
- 跟我一起学WCF(13)——WCF系列总结
引言 WCF是微软为了实现SOA的框架,它是对微乳之前多种分布式技术的继承和扩展,这些技术包括Enterprise Service..NET Remoting.XML Web Service.MSMQ ...
- 通过git rebase修改commit message
今天发现一个项目的git commit message中的单词拼错了,需要修改一下.但这样简单的修改,需要通过git rebase才能完成. 首先要git rebase到需要修改message的那个c ...
- 重新延时运行的Js 实现
场景 1. AutoComplete 插件, 当用户的输入空闲0.5s 时,才向服务发送请求.而不是用户输入每一个字符都要请求服务器. 2. 图片懒加载时,用户拖动滚动条空闲0.5s时,才遍历懒加载的 ...