作为一道板子题放在第二题令人身心愉悦,不到一个小时码完连对拍都没打。

关于tarjan割点的注意事项:

1.在该板子中我们求的是V-DCC,而不是缩点,V-DCC最少有两个点组成,表示出掉一个块里的任意

一点及其连边,联通性不变,所以割点只是顺便标记上low[to]>=dfn[x]的点,在以后的操作中

将割点与联通块连边,所以最坏情况下所生点数(即原图为一条链)为2*n-2

边数的话如没有明确给出一般为点数的8倍。

******(这题80分,就是数组开小,没加快读)*******

2.我们在tarjan中每次分联通块时,while(top!=to),因为x可以属于多个联通块,所以我们

不能将其弹栈,但可以将其放进块中

3.else中low用dfn更新,因为不这样我们会将所有节点更新为1,这里不需要判断to是否为fa

因为2.中的判断条件有>=;

4.多测清空!!!!!!!!!!!!!!

  1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<algorithm>
6 #include<cmath>
7 #include<stack>
8 #include<map>
9 #include<queue>
10 #define ps push_back
11 #define MAXN 405101
12 #define ll long long
13 using namespace std;
14 int read()
15 {
16 char c=getchar();int x=0;
17 while(c<'0'||c>'9')
18 {
19 c=getchar();
20 }
21 while(c>='0'&&c<='9')
22 {
23 x=(x<<1)+(x<<3)+(c^48);
24 c=getchar();
25 }
26 return x;
27 }
28 int dfn[MAXN],low[MAXN],cut[MAXN],de;
29 int vis[MAXN];
30 int num_id,cnt;
31 int belong[MAXN];
32 vector<int>v[MAXN];
33 stack<int>q;
34 struct node{int to,n;}e1[MAXN*4],e2[MAXN*4];
35 int head1[MAXN],head2[MAXN];int tot1,tot2;
36 void add1(int u,int v)
37 {
38 e1[++tot1].to=v;e1[tot1].n=head1[u];head1[u]=tot1;
39 }
40 void add2(int u,int v)
41 {
42 e2[++tot2].to=v;e2[tot2].n=head2[u];head2[u]=tot2;
43 }
44 void tarjan(int x)
45 {
46 dfn[x]=low[x]=++de;vis[x]=1;q.push(x);
47 int ss=0;
48 for(int i=head1[x];i;i=e1[i].n)
49 {
50 int to=e1[i].to;
51 if(dfn[to]==0)
52 {
53 tarjan(to);
54 low[x]=min(low[x],low[to]);
55 if(low[to]>=dfn[x])
56 {
57 ss++;
58 if(x!=1||ss>1)
59 {
60 cut[x]=1;
61 }
62 cnt++;
63 int top=0;
64 do
65 {
66 top=q.top();q.pop();vis[to]=0;
67 v[cnt].ps(top);
68 }
69 while(to!=top);
70 v[cnt].ps(x);
71 }
72 }
73 else
74 low[x]=min(low[x],dfn[to]);
75 }
76 }
77 int n;
78 int cut_kuan[MAXN];
79 void init()
80 {
81 num_id=cnt;
82 for(int i=1;i<=n;++i)
83 {
84 if(cut[i]==1)
85 {
86 belong[i]=++num_id;
87 cut_kuan[num_id]=i;
88 }
89 }
90 for(int x=1;x<=cnt;++x)
91 {
92 for(int i=0;i<v[x].size();++i)
93 {
94 int now=v[x][i];
95 if(cut[now]==1)
96 {
97 add2(belong[now],x);
98 add2(x,belong[now]);
99 }
100 else
101 {
102 belong[now]=x;
103 }
104 }
105 }
106 }
107 bool bian[MAXN];int fa[MAXN];
108 void DFS(int x)
109 {
110 bian[x]=1;
111 for(int i=head2[x];i;i=e2[i].n)
112 {
113 int to=e2[i].to;
114 if(bian[to]==1)continue;
115 fa[to]=x;
116 DFS(to);
117 }
118 }
119 int ans[MAXN];
120 void find()
121 {
122 int x=belong[n];
123 while(fa[x]!=0)
124 {
125 x=fa[x];
126 if(cut_kuan[x]!=0&&x!=belong[1])
127 {
128 ans[++ans[0]]=cut_kuan[x];
129 }
130 }
131 }
132 int T,m;
133 int main()
134 {
135 scanf("%d",&T);
136 while(T--)
137 {
138 memset(head1,0,sizeof(head1));
139 memset(head2,0,sizeof(head2));
140 memset(cut,0,sizeof(cut));
141 memset(dfn,0,sizeof(dfn));
142 memset(low,0,sizeof(low));
143 memset(vis,0,sizeof(vis));
144 memset(belong,0,sizeof(belong));
145 memset(fa,0,sizeof(fa));
146 memset(bian,0,sizeof(bian));
147 memset(ans,0,sizeof(ans));
148 memset(cut_kuan,0,sizeof(cut_kuan));
149 tot1=0;tot2=0;
150 n=read();m=read();
151 for(int i=1;i<=m;++i)
152 {
153 int x,y;
154 //scanf("%d%d",&x,&y);
155 x=read();y=read();
156 add1(x,y);add1(y,x);
157 }
158 tarjan(1);
159 init();
160 DFS(belong[1]);
161 find();
162 printf("%d\n",ans[0]);
163 sort(ans+1,ans+ans[0]+1);
164 for(int i=1;i<=ans[0];++i)
165 {
166 printf("%d ",ans[i]);
167 }
168 cout<<endl;
169 for(int i=1;i<=cnt;++i)
170 {
171 v[i].clear();
172 }
173 cnt=0;de=0;num_id=0;
174 }
175 }

【模拟7.25】回家(tarjan V-DCC点双连通分量的求法及缩点 求割点)模板题的更多相关文章

  1. UVA 315 求割点 模板 Tarjan

    D - D Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Pract ...

  2. Codeforces 962 /2错误 相间位置排列 堆模拟 X轴距离最小值 前向星点双连通分量求只存在在一个简单环中的边

    A #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #def ...

  3. Tarjan算法初探(3):求割点与桥以及双连通分量

    接上一节Tarjan算法初探(2):缩点 在此首先提出几个概念: 割点集合:一个无向连通图G 若删除它的一个点集 以及点集中所有点相连的边(任意一端在点集中)后 G中有点之间不再连通则称这个点集是它的 ...

  4. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)

    基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...

  5. tarjan复习笔记 双连通分量,强连通分量

    声明:图自行参考割点和桥QVQ 双连通分量 如果一个无向连通图\(G=(V,E)\)中不存在割点(相对于这个图),则称它为点双连通图 如果一个无向连通图\(G=(V,E)\)中不存在割边(相对于这个图 ...

  6. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  7. HZOI20190725 B 回家 tarjan

    题目大意:https://www.cnblogs.com/Juve/articles/11226266.html 题解: 感觉挺水的,但考场上没打出来 题目翻译一下就是输出起点到终点必经的点 其实就是 ...

  8. hdu 2586 How far away ?(LCA - Tarjan算法 离线 模板题)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. Tarjan 算法求割点、 割边、 强联通分量

    Tarjan算法是一个基于dfs的搜索算法, 可以在O(N+M)的复杂度内求出图的割点.割边和强联通分量等信息. https://www.cnblogs.com/shadowland/p/587225 ...

随机推荐

  1. XD to Flutter 2.0 现已发布!

    Flutter 是 Google 的开源 UI 工具包.利用它,只需一套代码库,就能开发出适合移动设备.桌面设备.嵌入式设备以及 web 等多个平台的精美应用.过去几年,对于想要打造多平台应用的开发者 ...

  2. InnoDB存储引擎简介

    前言: 存储引擎是数据库的核心,对于 MySQL 来说,存储引擎是以插件的形式运行的.虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属 InnoDB 了,本篇文章将主要介绍 InnoDB 存储 ...

  3. 3D高清电商购物小图标图片_在线商城三维icon图标素材大全

    3D高清电商购物小图标图片_在线商城三维icon图标素材大全

  4. [OS] 汇编语言

    操作系统 每个进程拥有一片连续的内存空间(地址空间),空间中的每个字节都可以用一个32位无符号整数定位,每个字节的位置称为地址 CPU 32位:能够处理的数据最大为32bit,地址空间2^32< ...

  5. [刷题] 104 Maximum Depth of Binary Tree

    要求 求一棵二叉树的最高深度 思路 递归地求左右子树的最高深度 实现 1 Definition for a binary tree node. 2 struct TreeNode { 3 int va ...

  6. [DB] 大数据集群安装

    学习要点 体系架构.原理 多做练习.试验 装虚拟机 网络模式:仅主机模式 software selection:development tools, GUI network & host na ...

  7. 搭建LAMP环境部署discuz论坛

    !!!什么是LAMP: LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写: Linux,操作系统 Apache,网页服务器 MariaDB或MySQL,数据库管理系统(或者 ...

  8. 一些固化了的语音识别模块demo, 手机重力传感器获取

    helloH5 这个软件里面有好多这个东东哦

  9. centos下yum方法安装apache+php+mysql

    yum(全称为:Yellow dog Updater,Modified) 是一个在Fedora和RedHat以及SUSE中的Shell前端管理软件.基于RPM包管理,能够从远处镜像服务器下载RPM包并 ...

  10. CentOS 7网络配置

    修改配置文件 CentOS 7下的网络配置文件路径为:/etc/sysconfig/network-scripts/ifcfg-interfacename 配置文件ifcfg-interface-na ...