CF949C Data Center Maintenance(建图+强联通分量)
题意
有 n 个信息中心,第 i 个信息中心要在第 ti 个小时维护,维护期间信息不能被获得。
每个用户的数据都有两份备份,第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2)。
现在要挑选一个尽量小的信息中心集合,使得将这个集合的维护时间推迟一个小时后,仍然能保证每个用户的数据在任意时刻都能获得。
n≤100000
题解
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int N=500100; 8 int cnt,head[N]; 9 int dfn[N],low[N],stack[N],vis[N],w[N],c[N],num,tot,top; 10 int n,m,h,t[N],ans,a[N],b[N],deg[N]; 11 struct edge{ 12 int to,nxt; 13 }e[N]; 14 void add(int u,int v){ 15 cnt++; 16 e[cnt].nxt=head[u]; 17 e[cnt].to=v; 18 head[u]=cnt; 19 } 20 void Tarjan(int u){ 21 dfn[u]=low[u]=++tot; 22 stack[++top]=u; 23 vis[u]=1; 24 for(int i=head[u];i;i=e[i].nxt){ 25 int v=e[i].to; 26 if(dfn[v]==0){ 27 Tarjan(v); 28 low[u]=min(low[u],low[v]); 29 } 30 else if(vis[v])low[u]=min(low[u],dfn[v]); 31 } 32 if(low[u]==dfn[u]){ 33 int x; 34 num++; 35 do{ 36 x=stack[top--]; 37 c[x]=num+n; 38 w[num+n]++; 39 add(num+n,x); 40 vis[x]=0; 41 }while(x!=u); 42 } 43 } 44 int main(){ 45 scanf("%d%d%d",&n,&m,&h); 46 for(int i=1;i<=n;i++){ 47 scanf("%d",&t[i]); 48 } 49 for(int i=1;i<=m;i++){ 50 scanf("%d%d",&a[i],&b[i]); 51 if(t[a[i]]+1==t[b[i]]||(t[a[i]]==h-1&&t[b[i]]==0))add(a[i],b[i]); 52 if(t[b[i]]+1==t[a[i]]||(t[b[i]]==h-1&&t[a[i]]==0))add(b[i],a[i]); 53 } 54 for(int i=1;i<=n;i++){ 55 if(dfn[i]==0)Tarjan(i); 56 } 57 for(int i=1;i<=m;i++){ 58 if(c[a[i]]==c[b[i]])continue; 59 if(t[a[i]]+1==t[b[i]]||(t[a[i]]==h-1&&t[b[i]]==0))deg[c[a[i]]]++; 60 if(t[b[i]]+1==t[a[i]]||(t[b[i]]==h-1&&t[a[i]]==0))deg[c[b[i]]]++; 61 } 62 int minn=9999999; 63 for(int i=n+1;i<=n+num;i++){ 64 if(deg[i]==0&&minn>w[i]){ 65 minn=w[i]; 66 ans=i; 67 } 68 } 69 printf("%d\n",w[ans]); 70 for(int i=head[ans];i;i=e[i].nxt){ 71 int v=e[i].to; 72 printf("%d ",v); 73 } 74 return 0; 75 }
View Code
转载于:https://www.cnblogs.com/Xu-daxia/p/9385811.html
CF949C Data Center Maintenance(建图+强联通分量)相关推荐
- BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2140 是 hydro 的 BZOJ ...
- CodeForces 1213F (强联通分量分解+拓扑排序)
传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...
- 强联通分量与双连通分量
强联通分量 1.概念 在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图. 定理: 1.一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次 ...
- 关于强联通分量 的求法讨论
这个讨论主要是关于 HA2006年最受欢迎的牛 的讨论 . 尽管这道题对于很多dalao来说都觉得是模板题,但是仍是值得思考的,因为我第一次写这道题的时候, 缩完点之后建图建错玄学跑dfs n^2做法 ...
- P3387-【模板】缩点【tarjan,强联通分量,DAGdp】
正题 评测记录: https://www.luogu.org/recordnew/lists?uid=52918&pid=P3387 大意 一个有向图.每个点有权值,但每个值只能取一次,每条边 ...
- Tarjan的强联通分量
求强联通分量有很多种. <C++信息学奥赛一本通> 中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...
- [vios1023]维多利亚的舞会3强联通分量tarjan
题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹 ...
- HDU6072(Kosaraju求强联通分量+位运算)
题意:给你n个点,和一个n*n的01矩阵表示边,有m次询问,问更改k条边后的强连通分量. 题解:对于每个询问,求出强连通分量,那么一个点数为t的强连通分量对答案的贡献为 t(t−1)2 \frac{t ...
- 强联通分量,双联通分量详解
正题 强联通分量 我们开两个数组 l o w , d f n low,dfn low,dfn . d f n dfn dfn 表示 i i i 点的 d f s dfs dfs 序, l o w lo ...
最新文章
- 行波iq调制器_高速InP基半导体电光调制器行波电极结构研究
- java.util.Vector排序
- HDU 5306 Gorgeous Sequence
- 【C language】C语言感悟之const
- C++类对象作为类成员
- java连接sql数据库代码_Java如何连接Sql的数据库
- android 中国市场份额 2015,2015年安卓芯片市场分析:不再一家独大
- android studio for android learning (二十六 )自定义控件理解与浅析(1)
- vs2019键盘钩子_江门网站建设:针对Web开发人员的12个最佳Visual Studio代码扩展
- linux 启动u盘引导,U盘启动引导安装linux
- 图解算法:八大排序算法
- bin文件转化为csv文件
- 04:AD采样【MSP430F5529】
- python简单好玩的代码_Python 趣味打怪:147 段简单代码助你从入门到大师
- 手机测试陨石软件,鉴定陨石真伪的简单测试方法
- Scrum板与Kanban如何抉择?kdliihoap板与按照xhvrcr
- WebRTC收集网卡地址信息 源码剖析
- 解决VBE6EXT.OLB不能被加载问题
- Matplotlib 箱线图
- 一、注册功能怎么测试