题目链接:传送门

思路:

如果图是点双联通的,即没有割点,直接从图中随意选两个点即可;

如果有一个割点,删除割点,求连通块的个数即可(在每个连通块内新建一个营救点)。

如果有多个割点,则可以通过其他割点到达,就不用新建营救点。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
typedef long long LL;
const int maxn = ;
int num[maxn],low[maxn],vis[maxn],gedian[maxn],tim,pt,root;
vector <int> vc[maxn];
vector <int> block[maxn];
stack <int> st;
int MAX(int x,int y)
{
return x>y?x:y;
}
int MIN(int x,int y)
{
return x<y?x:y;
}
void Init()
{
memset(vis,,sizeof(vis));
memset(num,,sizeof(num));
memset(low,,sizeof(low));
memset(gedian,,sizeof(gedian));
for(int i=;i<maxn;i++) vc[i].clear(),block[i].clear();
tim=;pt=;
while(!st.empty()) st.pop();
}
void Tarjan(int u,int pre)
{
num[u]=low[u]=++tim;
vis[u]=;
st.push(u);
int v,i,cnt=;
for(i=;i<vc[u].size();i++){
v=vc[u][i];
if(!vis[v]){
cnt++;
Tarjan(v,u);
low[u]=MIN(low[u],low[v]);
if((u==root&&cnt>)||(u!=root&&num[u]<=low[v])) gedian[u]=;
if(num[u]<=low[v]){
pt++;
int kk;
do{
kk=st.top();
block[pt].push_back(kk);
st.pop();
}while(!st.empty()&&kk!=v);
block[pt].push_back(u);
}
}
else low[u]=MIN(low[u],num[v]);
}
}
int main(void)
{
int n,m,x,y,i,j,T=;
while(~scanf("%d",&m)&&m){
Init();
n=;
for(i=;i<=m;i++){
scanf("%d%d",&x,&y);
n=MAX(n,MAX(x,y));
vc[x].push_back(y);
vc[y].push_back(x);
}
for(i=;i<=n;i++)
if(vis[i]==){
root=i;
Tarjan(i,-);
}
int art,len;
LL ans=,artnum=;
for(i=;i<=pt;i++){
art=;len=block[i].size();
for(j=;j<len;j++)
if(gedian[block[i][j]]) art++;
if(art==) ans+=,artnum=artnum*len*(len-)/;
else if(art==) ans++,artnum=artnum*(len-);
}
printf("Case %d: %lld %lld\n",T++,ans,artnum);
}
return ;
}

LOJ-10099(点双联通)的更多相关文章

  1. loj 1300( 边双联通 + 判奇圈 )

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27010 思路:首先Tarjan标记桥,然后对于dfs遍历整个图,我 ...

  2. POJ3177 & 求边双联通分量

    题意: 给一张无向图,求加多少边使原图任意两点边双联通. SOL: 一个不会写边双点双强联通的傻逼. 一个结论:把一棵树变成满足条件的图需要加的边使入度为1的点数+1除以2.------>就是树 ...

  3. [POJ3177]Redundant Paths(双联通)

    在看了春晚小彩旗的E技能(旋转)后就一直在lol……额抽点时间撸一题吧…… Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  4. hdu 3849 (双联通求桥)

    一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...

  5. hdu 4612 (双联通+树形DP)

    加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:10240 ...

  6. 【UVA10972】RevolC FaeLoN (求边双联通分量)

    题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...

  7. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  8. hdu 2460 poj 3694 (双联通+LCA)

    在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖 ...

  9. HDU5409---CRB and Graph 2015多校 双联通分量缩点

    题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...

  10. hdu 4738 (双联通求桥)

    2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要 ...

随机推荐

  1. Django的restframework的序列化组件之对单条数据的处理

    之前我们学习的都是处理书籍或者出版社的所有的数据的方法,下面我们来看下处理单个书籍,或者单个出版社的方法 这个时候我们就需要重新写一个类,这个类的方法,就需要有3个参数,参数1是self,参数2是re ...

  2. Httpclient 表单,json,multipart/form-data 提交 ---总结常用的方法

    最近在项目中,一直在使用HttpClient 中的方法,这里我进行一些方法的汇总,也是结合了一些大牛写的代码,以备不时之需 官话:HttpClient 是Apache Jakarta Common 下 ...

  3. JDBC的学习

    JDBC —— 用Java访问数据库 一.需要用到第三方类:mysql-connector-java-5.0.8-bin.jar,并做好导包处理: 二.初始化驱动: 三.建立与数据库的链接: 四.创建 ...

  4. input框和文字对齐问题

    css样式解决! style="vertical-align: text-bottom;margin-bottom: 2px;"一.问题产生的条件对于14像素大小的字体是没有本篇所 ...

  5. 基础数据类型补充,及capy daty7

    1,基础数据类型,总结补充. int:bit_lenth() str: captilze() 首字母大写,其余小写. upper() 全大写. lower() 全小写. find() 通过元素找索引, ...

  6. 学习knockoutjs轻量级的MVVM框架

    教程:knockoutjs介绍 http://www.w3cfuns.com/forum.php?mod=viewthread&tid=5598714 MVVM架构~knockoutjs实现简 ...

  7. hdu 5326(基础题) work

    http://acm.hdu.edu.cn/showproblem.php?pid=5326 一道水题,题目大意是在公司里,给出n个员工和目标人数m,然后下面的n-1行是表示员工a管理b,问在这些员工 ...

  8. unbutton 内部title label多行显示

    dateBtn1.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; [dateBtn1 setTitle: @第一行\n第二行" f ...

  9. php 类与对象

    1.类与对象 对象:实际存在该类事物中每个实物的个体.$a =new User(); 实例化后的$a引用:PHP的别名,两个不同的变量名字指向相同的内容 封装: 把对象的属性和方法组织在一个类(逻辑单 ...

  10. 清晰易懂!关于PS入门的超详细笔记!

    给大家分享一篇关于PS入门的超详细笔记!原理讲解清晰明了,虽不是新版本解析,但都是新手学习PS必掌懂的一些知识点,灰常的实用,转走收藏学习! 编辑:千锋UI设计 来源:PS学堂