https://vjudge.net/problem/UVALive-5135

题意:
在一个无向图上选择尽量少的点涂黑,使得任意删除一个点后,每个连通分量至少有一个黑点。

思路:

首先dfs遍历求出割顶和双连通分量,并把每个连通分量保存下来。

接下来分情况讨论:

如果一个点—双连通分量只有一个割顶,在该分量中必须将一个非割顶涂黑。

如果一个点—双连通分量有2个及以上的割顶,不需要涂黑。

如果整个图没有割顶,则至少需要涂黑两个点。(因为有可能删除的就是涂黑的点)

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std; const int maxn=+;
int m; struct Edge
{
int u,v;
Edge(int x,int y):u(x),v(y){}
};
stack<Edge> S; int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;
vector<int> G[maxn],bcc[maxn]; int dfs(int u,int fa)
{
int lowu=pre[u]=++dfs_clock;
int child=;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
Edge e=Edge(u,v);
if(!pre[v])
{
S.push(e);
child++;
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
if(lowv>=pre[u])
{
iscut[u]=true;
bcc_cnt++; bcc[bcc_cnt].clear();
for(;;)
{
Edge x=S.top(); S.pop();
if(bccno[x.u]!=bcc_cnt) {bcc[bcc_cnt].push_back(x.u);bccno[x.u]=bcc_cnt;}
if(bccno[x.v]!=bcc_cnt) {bcc[bcc_cnt].push_back(x.v);bccno[x.v]=bcc_cnt;}
if(x.u==u&&x.v==v) break;
}
}
}
else if(pre[v]<pre[u] && v!=fa)
{
S.push(e);
lowu=min(lowu,pre[v]);
}
}
if(fa< && child==) iscut[u]=;
return lowu;
} void find_bcc(int n)
{
memset(pre,,sizeof(pre));
memset(iscut,,sizeof(iscut));
memset(bccno,,sizeof(bccno));
dfs_clock=bcc_cnt=;
for(int i=;i<=n;i++)
if(!pre[i]) dfs(,-);
} int main()
{
//freopen("D:\\input.txt","r",stdin);
int kase=;
while(~scanf("%d",&m) && m)
{
for(int i=;i<maxn;i++) {G[i].clear();bcc[i].clear();}
for(int i=;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
find_bcc(m);
long long ans1=,ans2=;
for(int i=;i<=bcc_cnt;i++)
{
int cut_cnt=;
for(int j=;j<bcc[i].size();j++)
{
if(iscut[bcc[i][j]]) cut_cnt++;
}
if(cut_cnt==)
{
ans1++; ans2*=(long long)(bcc[i].size()-cut_cnt);
}
}
if(bcc_cnt==)
{
ans1=; ans2=bcc[].size()*(bcc[].size()-)/;
}
printf("Case %d: %lld %lld\n",++kase,ans1,ans2);
}
return ;
}

最新文章

  1. (原) 1.3 zookeeper脚本使用
  2. ie 8 下post提交提交了两次
  3. java 中的一个项目如何做到访问另一个项目的一个方法 或者 页面
  4. 【crunch bang】调整窗口大小
  5. jQuery 1.7_20120209 学习笔记
  6. Host绑定
  7. VB.NET生成Excel,已存在提示框点否时报错
  8. 201521123088《Java程序设计》第13周学习总结
  9. Building roads
  10. Grunt打包之seajs项目【转】
  11. poj2406 连续重复子串
  12. max-width和width的区别
  13. nginx + rtmp 搭建流媒体服务器
  14. HDFS笔记(二)
  15. activemq 无法消费! consumers are alive when the messages are stuck !
  16. Java微信二次开发(九)
  17. 2019.03.30 Head first
  18. 区块链与Git版本工具的比较
  19. Django的学习(三)————models
  20. python中获取执行脚本路径方法

热门文章

  1. ActiveMQ 详解
  2. 项目删除又重新clone,未重新进入项目目录或重启terminal,导致git命令或其他命令报 目录不存在的错误
  3. 服务遇到错误。很可能由IncludeExceptionDetailInFaults=true创建的ExceptionDetail,其值为:System.ArgumentException:指定的值还有无效的控制字符
  4. Linux ls命令
  5. java实现简单的数据库的增删查改,并布局交互界面
  6. jQuery异步加载数据并添加事件示例
  7. SDUT3165:Round Robina(循环链表)
  8. python全栈开发从入门到放弃之socket并发编程多线程
  9. SQL Server创建事务——锁
  10. [Windows Powershell]-学习笔记(1)