题目链接:传送门

思路:

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

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

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

#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. Codeforces Beta Round #55 (Div. 2)

    Codeforces Beta Round #55 (Div. 2) http://codeforces.com/contest/59 A #include<bits/stdc++.h> ...

  2. kraken-ejs创建一个项目【学习札记】

    Keep in Touch. 保持联络. Who’s calling? 是哪一位? You did right. 你做得对. You set me up! 你出卖我! kraken-express-e ...

  3. TZOJ 4621 Grammar(STL模拟)

    描述 Our strings only contain letters(maybe the string contains nothing). Now we define the production ...

  4. mysql学习1:数据类型:数字型,日期和时间,字符串类型(总结)

    mysql数据类型:数字型,日期和时间,字符串类型 摘要 MySQL中定义数据字段的类型对数据库的优化是非常重要的: MySQL支持多种类型,大致可以分为三类,如下. 数字类型 整数:tinyint. ...

  5. vue解决遮罩层滚动方法

    vue 遮罩层阻止默认滚动事件 在写移动端页面的时候,弹出遮罩层后,我们仍然可以滚动页面. vue中提供 @touchmove.prevent 方法可以完美解决这个问题 <div class=& ...

  6. 使用json要导入什么包

    json-lib-2.3-jdk15.jar commons-beanutils-1.7.0.jar commons-httpclient-3.1.jar commons-lang-2.3.jar c ...

  7. Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not mat

    Could not load file or assembly 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b ...

  8. EntityFramework的linq扩展where

    代码 using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; ...

  9. Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead.解决方法

    今天在eclipse里报这个错误: Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead. Please ...

  10. u-boot之内核是怎么启动的

    在u-boot之start_armboot函数分析已经分析过了整个程序框架,但只是说了下什么时候运行内核,并没有具体说明是怎么执行内核的.内核启动分以下几个步骤说明: 1.启动参数bootcmd=na ...