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个及以上割顶的双连通分量可以不 ...
随机推荐
- #import、#include、@class、@protocol、@interface
#include 它用于对系统自带的头文件的引用,编译器会在系统文件目录下去查找该文件.(注意重复引用) #import 是Objective-C针对#include的改进版本,确保引用的文件只会被引 ...
- Win7 64位 VS2013环境编译CGAL-4.7
看到有人在QQ空间感叹编译CGAL配置折腾了一天时间,自己也想试试,虽然并不打算用,但感觉这库也挺有名的,想必日后用得着,于是着手试着编译. 首先是看一下官网的windows下配置说明 http:// ...
- 斯坦福第十六课:推荐系统(Recommender Systems)
16.1 问题形式化 16.2 基于内容的推荐系统 16.3 协同过滤 16.4 协同过滤算法 16.5 矢量化:低秩矩阵分解 16.6 推行工作上的细节:均值归一化 16.1 问题形式 ...
- 斯坦福第七课:正则化(Regularization)
7.1 过拟合的问题 7.2 代价函数 7.3 正则化线性回归 7.4 正则化的逻辑回归模型 7.1 过拟合的问题 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好地适应训练集( ...
- 文件和目录:access函数
access函数是按照实际用户ID和实际组ID进行访问权限测试的: #include <unistd.h> int access( const char *pathname, int mo ...
- MySQL数据库小实验
实验1 1.创建数据表 CREATE TABLE guest( Accounts ) NOT NULL, Details ) NOT NULL, Date ) NOT NULL, ,), Class ...
- ElasticSearch介绍 【未完成】
ElasticSearch应用于搜索是一个不错的选择,虽有Lucene,但ELK的搜索方便. http://joelabrahamsson.com/elasticsearch-101/ 一.下载 ht ...
- Learning OpenCV
1. 读取图片 opencv/highgui.h 2. 读取视频 opencv/cv.h opencv/highgui.h 3. 高斯平滑滤波 4. 灰度单通道与边缘检测 5. 摄像头打开 void ...
- socket基础
一.socket简介 1. 套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和 ...
- linux SMP启动
SMP简介 1,硬件上,CPU没有主次之分 2,软件上,每个CPU平等动态地从进程就绪队列中调度进程加以执行,中断请求也是等概率动态的分布给某个CPU SMP启动 1,SMP结构中的CPU都是平等的, ...