Day7 割点、割边和强连通分量
A.【dfn】交换机 割点 模板
题目
题目描述
n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接。因电子设备容易损坏,需给通讯点配备备用交换机。
但备用 交换机数量有限,不能全部配备,只能给部分重要城市配置。
于是规定:如果某个城市由于交换机损坏,不仅本城市通讯中断,还造成其它城市通讯中断,则配备备 用交换机。
请你根据城市线路情况,计算需配备备用交换机的城市个数,及需配备备用交换机城市的编号。
友情提示:图论常见的坑点,重边,自环,还有对本题来说的不连通
输入格式
第一行,一个整数n,表示共有n个城市(2<=n<=20000)
下面有若干行(<=60000):每行2个数a、b,a、b是城市编号,表示a与b之间有直接通讯线路。
输出格式
第一行,1个整数m,表示需m个备用交换机。
下面有m行,每行有一个整数,表示需配备交换机的城市编号。
输出顺序按编号由小到大。如果没有城市需配备备用交换机则输出0。
样例数据
input
7
1 2
2 3
2 4
3 4
4 5
4 6
4 7
5 6
6 7
output
2
2
4
数据规模与约定
gdoi
时间限制:1s
空间限制:256MB
错误原因
1.局部变量未初始化为。
2.数据范围开小了。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=6e4+10;
template<typename T>inline void read(T &x)
{
x=0;
T f=1,ch=getchar();
while (!isdigit(ch)) ch=getchar();
if (ch=='-') f=-1, ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
x*=f;
}
int ver[maxn<<1],Next[maxn<<1],head[maxn],len;
inline void add(int x,int y)
{
ver[++len]=y,Next[len]=head[x],head[x]=len;
}
int dfn[maxn],low[maxn],id,root;
bool cut[maxn];
inline void tarjan(int x)
{
int tot=0;
low[x]=dfn[x]=++id;
for (int i=head[x];i;i=Next[i])
{
int y=ver[i];
if (!dfn[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);//更新当前节点的low值
if (low[y]>=dfn[x])
{
++tot;
if (x^root || tot>1) cut[x]=1;
}
}
else
low[x]=min(low[x],dfn[y]);
}
}
int main()
{
freopen("gd.in","r",stdin);
freopen("gd.out","w",stdout);
int n,x,y,ans=0;read(n);
while (scanf("%d %d",&x,&y)==2)
{
if (x==y) continue;
add(x,y),add(y,x);
}
for (int i=1;i<=n;++i)
if (!dfn[i]) root=i,tarjan(i);
for (int i=1;i<=n;++i)
if (cut[i]) ++ans;
printf("%d\n",ans);//割点的总数
for (int i=1;i<=n;++i)
if (cut[i])
printf("%d\n",i);//输出割点
return 0;
}
B. [zjoi2004]嗅探器——dfnlow经典题目 割点
题目p1693
描述 Description
某军搞信息对抗实战演习.红军成功地侵入了蓝军的内部网络.蓝军共有两个信息中心.红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息.但是蓝军的网络相当的庞大,数据包从一个信息中心传到另一个信息中心可以不止有一条通路.现在需要你尽快地解决这个问题.应该把嗅探器安装在哪个中间服务器上才能保证所有的数据包都能被捕获?
输入格式 Input Format
第一行一个整数n(1<=n<=100000),表示蓝军网络中服务器的数目.
接下来若干行是对蓝军网络的拓扑结构描述.每行是两个整数i,j表示编号为I和编号为j的两台服务器间存在连接(显然连接是双向的).服务器的编号从1开始.描述一两个0结束.再接下来一行是两个整数a,b分别表示两个中心服务器的编号.
输出格式 Output Format
如果有多个解输出编号最小的一个.如果找不到任何解,输出”No solution”.
样例输入 Sample Input
5
2 1
2 5
1 4
5 3
2 3
5 1
0 0
4 2
样例输出 Sample Output
1
时间限制 Time Limitation
1s
注释 Hint
部分小数据
来源 Source
zjoi2004
数据加强来自 2017届 杨晓虎 岳川梦真
题解
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
template<typename T>inline void read(T &x)
{
x=0;
T f=1,ch=getchar();
while (!isdigit(ch)) ch=getchar();
if (ch=='-') f=-1, ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
x*=f;
}
int ver[maxn<<1],Next[maxn<<1],head[maxn],len;
inline void add(int x,int y)
{
ver[++len]=y,Next[len]=head[x],head[x]=len;
}
int s,t,ans=0x3f3f3f3f;
int dfn[maxn],low[maxn],id;
inline void tarjan(int x,int root)
{
dfn[x]=low[x]=++id;
for (int i=head[x];i;i=Next[i])
{
int y=ver[i];
if (!dfn[y])
{
tarjan(y,x);
low[x]=min(low[x],low[y]);
if (x!=s && low[y]>=dfn[x] && dfn[t]>=dfn[y] && low[t]>=dfn[x])
ans=min(ans,x);
}
else if (y!=root)
low[x]=min(low[x],dfn[y]);
}
}
int main()
{
freopen("dfnIn.in","r",stdin);
freopen("dfnin.out","w",stdout);
int n;read(n);
while (1)
{
int x,y;
read(x);read(y);
if (!x && !y) break;
add(x,y),add(y,x);
}
read(s);read(t);
tarjan(s,0);
if (ans>n) printf("No solution\n");
else printf("%d\n",ans);
return 0;
}
C. BZOJ 1123: [POI2008]BLO 割点
题目
错误原因
未开。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
template<typename T>inline void read(T &x)
{
x=0;
T f=1,ch=getchar();
while (!isdigit(ch)) ch=getchar();
if (ch=='-') f=-1, ch=getchar();
while (isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48), ch=getchar();
x*=f;
}
int ver[maxn<<1],Next[maxn<<1],head[maxn],len;
inline void add(int x,int y)
{
ver[++len]=y,Next[len]=head[x],head[x]=len;
}
int dfn[maxn],low[maxn],id,n,m;
int cut[maxn],siz[maxn];
long long ans[maxn];
inline void tarjan(int x)
{
dfn[x]=low[x]=++id;
siz[x]=1;
int tot=0,sum=0;
for (int i=head[x];i;i=Next[i])
{
int y=ver[i];
if (!dfn[y])
{
tarjan(y);
siz[x]+=siz[y];//计算以x为跟的子树的大小
low[x]=min(low[x],low[y]);
if (low[y]>=dfn[x])//割点判定法则
{
++tot;
ans[
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python获取百度热榜链接的实例方法
- 多图+代码 | 详解Python操作Excel神器openpyxl的各种操作!
- 为了给女朋友独特的七夕惊喜,我学会了人像美肤算法!
- Docker入门笔记总结
- AWVS13破解版安装
- Sqlmap注入使用技巧总结
- Lyft 宣布开源基础设施工具管理平台 Clutch!
- 从库mysqldump会导致复制中断
- DBA的福音,SQL审核利器-goinception
- 前端组件设计原则
- 分析网页 JavaScript Bundles 的几种方法
- 使用 DevTools 新增的 Issues 选项卡发现网页问题
- OpenCV绘制标记函数drawMarker()
- 【crossbeam系列】3 crossbeam-deque:work-stealing算法
- 【Rust日报】2020-08-21 RustConf研讨会在线举办