LOJ-10099(点双联通)
题目链接:传送门
思路:
如果图是点双联通的,即没有割点,直接从图中随意选两个点即可;
如果有一个割点,删除割点,求连通块的个数即可(在每个连通块内新建一个营救点)。
如果有多个割点,则可以通过其他割点到达,就不用新建营救点。
#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(点双联通)的更多相关文章
- loj 1300( 边双联通 + 判奇圈 )
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27010 思路:首先Tarjan标记桥,然后对于dfs遍历整个图,我 ...
- POJ3177 & 求边双联通分量
题意: 给一张无向图,求加多少边使原图任意两点边双联通. SOL: 一个不会写边双点双强联通的傻逼. 一个结论:把一棵树变成满足条件的图需要加的边使入度为1的点数+1除以2.------>就是树 ...
- [POJ3177]Redundant Paths(双联通)
在看了春晚小彩旗的E技能(旋转)后就一直在lol……额抽点时间撸一题吧…… Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Tota ...
- hdu 3849 (双联通求桥)
一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...
- hdu 4612 (双联通+树形DP)
加一条边后最少还有多少个桥,先Tarjan双联通缩点, 然后建树,求出树的直径,在直径起点终点加一条边去的桥最多, #pragma comment(linker, "/STACK:10240 ...
- 【UVA10972】RevolC FaeLoN (求边双联通分量)
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...
- lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...
- hdu 2460 poj 3694 (双联通+LCA)
在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖 ...
- HDU5409---CRB and Graph 2015多校 双联通分量缩点
题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...
- hdu 4738 (双联通求桥)
2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要 ...
随机推荐
- Codeforces Beta Round #63 (Div. 2)
Codeforces Beta Round #63 (Div. 2) http://codeforces.com/contest/69 A #include<bits/stdc++.h> ...
- vue初学:基础概念
一.vue使用步骤: 1.引包vue.js 2.html中写要操作的DOM节点 3.创建vue对象:new Vue({options}); 4.配置options:el:(要操作的对象,用选择器,同j ...
- 解决com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭
com.microsoft.sqlserver.jdbc.SQLServerException: 该连接已关闭. at com.microsoft.sqlserver.jdbc.SQLServerEx ...
- PHP统计网站pv(访问量)
//首先判断有没有统计的文件 if(is_file("pv.txt")){//有 //取文件里面的值 $count=file_get_contents("pv.txt&q ...
- docker-ce-17.09 数据卷和数据卷容器
docker容器中管理数据两种方式:1.数据卷(Data Volumes)2.数据卷容器(Data Volume Dontainers) 一.数据卷特性:1.数据卷可以在容器之间共享和重用2.对数据卷 ...
- sqlserver数据库的物理存储格式和逻辑存储格式
物理存储结构: 数据库文件在磁盘上的存储形式: 主数据文件:*.mdf.用来存储数据库的启动信息.存储部分或全部的数据.整个的数据库只能有一个主数据文件 辅助数据文件:*.ndf.用于存储主数据文件未 ...
- pycharm 配置支持vue
http://www.cnblogs.com/c-x-m/p/9229199.html
- 9.28 h5日记
9.28 1.transparent 透明的 颜色 2.placeholder 提示语 在input中使用 跟velue不同 3.写页面需要注意的 (1)页面一定要有层次,分清层次 (2)保证元素模块 ...
- c# 软件绑定网卡mac的实用
一:网上搜c# 绑定网卡Mac 有好多信息,其中有篇分为几种方法获取mac 的方法,结果获得到的是一个list 队列的信息,信息获取到所有的物理网卡,无线网卡,蓝牙,隧道的网卡物理地址.对与软件绑定物 ...
- python添加fluent日志记录
istio默认会进行日志的记录,但是仅仅记录到服务.以及服务之间调用的信息,不记录业务日志. 如: 所以需要添加业务日志记录. 1.python引入package fluentmsgpack 2.代码 ...