题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2730

首先一遍tarjan找出割点,将图缩点,这些大点中如果有只包含一个割点的,那么如果这个割点被去掉,则这个大点与图不连通,所以这个大点内必须有一个出口;

而如果没有割点,需要建两个出口,以防止一个出口点被去掉;

方案数就是放出口的大点的size乘积;没有割点则方案数为C(m,2);

注意自己记录点数。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
int const MAXN=;
vector<int>dcc[MAXN];
int t,n,m,siz,tim,ct,head[MAXN],dfn[MAXN],low[MAXN],num,k;
long long ans;
bool vis1[MAXN],vis2[MAXN],cut[MAXN];
struct N{
int to,next;
N(int t=,int n=):to(t),next(n) {}
}edge[MAXN<<];
void add(int x,int y)
{
edge[++ct]=N(y,head[x]);head[x]=ct;
edge[++ct]=N(x,head[y]);head[y]=ct;
}
void tarjan(int x,int f)
{
dfn[x]=low[x]=++tim;
int fl=;
for(int i=head[x],u;i;i=edge[i].next)
{
if(edge[i].to==f)continue;
if(!dfn[u=edge[i].to])
{
fl++;
tarjan(u,x);
low[x]=min(low[x],low[u]);
if(low[u]>=dfn[x])/*fl++,*/cut[x]=;
}
else low[x]=min(low[x],dfn[u]);
}
if(!f&&fl==)cut[x]=;
}
int dfs(int x)
{
int siz=;
vis1[x]=;
for(int i=head[x],u;i;i=edge[i].next)
{
if(vis1[u=edge[i].to]||vis2[u])continue;
if(!cut[u])siz+=dfs(u);
// if(!cut[u])siz++,dfs(u);
else if(!vis2[u])vis2[u]=,num++;
}
return siz;
}
int main()
{
while(scanf("%d",&n)==)
{
if(!n)return ;
t++;ct=;
tim=;m=;//
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
memset(cut,,sizeof cut);
memset(head,,sizeof head);
memset(vis1,,sizeof vis1);
int x,y;
for(int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
m=max(m,x);m=max(m,y);
}
for(int i=;i<=m;i++)
if(!dfn[i])tarjan(i,);
ans=;k=;
for(int i=;i<=m;i++)
if(!vis1[i]&&!cut[i])//不能是割点
{
num=;
memset(vis2,,sizeof vis2);
siz=dfs(i);
if(num==)k++,ans*=siz;
}
if(!k)k=,ans=(long long)m*(m-)/;//m!
printf("Case %d: %d %lld\n",t,k,ans);
}
return ;
}

最新文章

  1. delphi 图像旋转
  2. 借助Nodejs在服务端使用jQuery采集17173游戏排行信息
  3. purple-class2-默认选项切换
  4. linux shell if 参数
  5. c#简单数组
  6. 【Demo 0004】屏幕、窗体及视图基础知识
  7. IOS获得各种文档文件夹路径的方法
  8. PHP获取中英文字符串的首字母
  9. 蓝牙协议分析(9)_BLE安全机制之LL Privacy
  10. angular2+中数据变更子组件页面未更新
  11. python中的__call__()函数
  12. scala变量类型和性质
  13. final 140字评论II
  14. idea中 mybatis的debug文件需要放在src的目录下 不能加多余的路径
  15. Android 使用MediaPlayer 播放 视频
  16. FastAdmin 系统配置中添加选项卡
  17. 第二百九十七节,python操作redis缓存-List类型,可以理解为列表
  18. sublime3095-注册码下载安装
  19. JVM的反射实现
  20. C++基础知识:成员函数、对象拷贝、私有成员

热门文章

  1. apk 签名
  2. 初涉IPC,了解AIDL的工作原理及用法
  3. 【转载】读懂IL代码就这么简单(三)完结篇
  4. mqtt client python example
  5. 怎样在C语言里实现“面向对象编程”
  6. 【每日Scrum】第二天(4.12) TD学生助手Sprint1站立会议
  7. UiAutomator源代码分析之获取控件信息
  8. 【机器学习算法-python实现】PCA 主成分分析、降维
  9. Oracle中,将毫秒数转换为timestamp类型的两种方法
  10. 文件共享和使用 dup 函数创建新描述符的区别