矿场搭建

题目链接

根据题意,发生事故时会有一个挖煤点坍塌,

只有当这个点是割点,会对图的连通性产生影响,

我们首先Tarjan一遍找到所有割点,将原图除去这些割点后,

遍历一遍,找出所有连通块,分三种情况讨论:

1、该连通块连接着两个及以上的割点,这时如果有一个割点被摧毁,

还可以从另一个割点到达其他连通块,不需要建逃生通道

2、该连通块连接着一个割点,若这个割点被摧毁,该连通块的人就无法逃生,

必须建一个出口(从该连通块的所有节点中选一个,ans*=size)

3、该连通块没有割点相连,要建两个出口,如果其中一个被摧毁,还可以从另一个逃出去

ans*=C(size,2);

 #include<algorithm>
#include<cstdio>
#define reset(a) std::fill(a,a+1+n,0)
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define N 50020
int n,m,dfn[N],low[N],vis[N],tot,k,T;
const int ch_top=4e7+;
char ch[ch_top],*now_r=ch-,*now_w=ch-;
inline int read(){
while(*++now_r<'');
register int x=*now_r-'';
while(*++now_r>='')x=x*+*now_r-'';
return x;
}
long long ans;
bool gd[N];
int Head[N],to[N<<],next[N<<],num;
void Tarjan(int u){
dfn[u]=low[u]=++tot;
int cnt=;
for(int i=Head[u];i;i=next[i]){
int v=to[i];
if(!dfn[v]){
Tarjan(v); cnt++;
low[u]=min(low[u],low[v]);
if((u==&&cnt>)||(u!=&&low[v]>=dfn[u]))
gd[u]=;
}
else low[u]=min(low[u],dfn[v]);
}
}
int dfs(int t){
int sz=; vis[t]=;
for(int i=Head[t];i;i=next[i])
if(!vis[to[i]]&&!gd[to[i]])
sz+=dfs(to[i]);
else if(vis[to[i]]!=T&&gd[to[i]]){
k++; vis[to[i]]=T;
}
return sz;
}
int main()
{
fread(ch,,ch_top,stdin);
int now=;
m=read();
while(m){
if(!m) break;
reset(Head); reset(gd);
reset(vis); reset(dfn);
num=tot=n=T=;
int x,y;
for(int i=;i<=m;i++){
x=read(); y=read();
to[++num]=y;
next[num]=Head[x];
Head[x]=num;
to[++num]=x;
next[num]=Head[y];
Head[y]=num;
n=max(n,max(x,y));
}
int cnt=;
Tarjan();ans=;
for(int i=;i<=n;i++)
if(!gd[i]&&!vis[i]){
k=; T++;
int size=dfs(i);
if(k==) ans*=(long long)size*(size-)/,cnt+=;
else if(k==) ans*=size,cnt++;
}
printf("Case %d: %d %lld\n",++now,cnt,ans);
m=read();
}
return ;
}

双倍经验:UVA1108

最新文章

  1. UML中的六大关系(转)
  2. 如何删除PHP数组中的元素,并且索引重排(unset,array_splice)?
  3. [hihoCoder1329] 带Split和Merge的Treap
  4. HTTP 状态代码表示什么意思?
  5. JavaScript系列:函数 自执行 表达式 声明 定义
  6. NoSQL数据库的分布式算法&amp;&amp;memcache集群的实现
  7. Win7 下硬盘安装Linux Mint 17
  8. puppet report import
  9. git commit -am 合并操作
  10. Android中使用HTTP服务
  11. 自然语言处理(NLP)常用开源工具总结(转)
  12. group by 和count 联合使用问题
  13. Nexus搭建私服 学习
  14. Bootstrap入门(二十七)JS插件4:标签页
  15. ABP PUT、DELETE请求错误405.0 - Method Not Allowed 因为使用了无效方法(HTTP 谓词) 引发客户端错误 No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource
  16. Django2.0文档
  17. call,apply,bind 方法的学习
  18. Target JRE version (1.7.0_79) does not match project JDK version (java version &quot;1.8.0_171&quot;), will use sources from JDK: 1.7
  19. Git安装配置和提交本地代码至Github,修改GitHub上显示的项目语言
  20. MATLAB中的FOR循环问题

热门文章

  1. 数据段描述符和代码段描述符(二)——《x86汇编语言:从实模式到保护模式》读书笔记11
  2. centOS使用.htaccess
  3. FZU 2122 ——又见LKity——————【KMP字符串匹配】
  4. nyoj 568——RMQ with Shifts——————【线段树单点更新、区间求最值】
  5. 经典算法详解(1)斐波那契数列的n项
  6. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)
  7. java poi reader常用API汇总
  8. 1094 FBI树
  9. angular1结合webpack构建工具
  10. easyui datagrid 获取行数据某个字段