题意

有 n 个信息中心,第 i 个信息中心要在第 ti 个小时维护,维护期间信息不能被获得。

每个用户的数据都有两份备份,第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2)。

现在要挑选一个尽量小的信息中心集合,使得将这个集合的维护时间推迟一个小时后,仍然能保证每个用户的数据在任意时刻都能获得。

n≤100000

题解

对于每对 c(i,1),c(i,2),若调整 c(i,1) 后与 c(i,2) 的维护时间冲突,则连边 (c(i,1), c(i,2) )
对于 c(i,2),c(i,1) 亦然
求出强连通分量,所求集合即为缩点后度数为 0 的最小的 SCC

 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(建图+强联通分量)相关推荐

  1. BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2140 是 hydro 的 BZOJ ...

  2. CodeForces 1213F (强联通分量分解+拓扑排序)

    传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...

  3. 强联通分量与双连通分量

    强联通分量 1.概念 在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图. 定理: 1.一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次 ...

  4. 关于强联通分量 的求法讨论

    这个讨论主要是关于 HA2006年最受欢迎的牛 的讨论 . 尽管这道题对于很多dalao来说都觉得是模板题,但是仍是值得思考的,因为我第一次写这道题的时候, 缩完点之后建图建错玄学跑dfs n^2做法 ...

  5. P3387-【模板】缩点【tarjan,强联通分量,DAGdp】

    正题 评测记录: https://www.luogu.org/recordnew/lists?uid=52918&pid=P3387 大意 一个有向图.每个点有权值,但每个值只能取一次,每条边 ...

  6. Tarjan的强联通分量

    求强联通分量有很多种. <C++信息学奥赛一本通>  中讲过一个dfs求强联通分量的算法Kosdaraju,为了骗字数我就待会简单的说说.然而我们这篇文章的主体是Tarjan,所以我肯定说 ...

  7. [vios1023]维多利亚的舞会3强联通分量tarjan

    题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹 ...

  8. HDU6072(Kosaraju求强联通分量+位运算)

    题意:给你n个点,和一个n*n的01矩阵表示边,有m次询问,问更改k条边后的强连通分量. 题解:对于每个询问,求出强连通分量,那么一个点数为t的强连通分量对答案的贡献为 t(t−1)2 \frac{t ...

  9. 强联通分量,双联通分量详解

    正题 强联通分量 我们开两个数组 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 ...

最新文章

  1. 行波iq调制器_高速InP基半导体电光调制器行波电极结构研究
  2. java.util.Vector排序
  3. HDU 5306 Gorgeous Sequence
  4. 【C language】C语言感悟之const
  5. C++类对象作为类成员
  6. java连接sql数据库代码_Java如何连接Sql的数据库
  7. android 中国市场份额 2015,2015年安卓芯片市场分析:不再一家独大
  8. android studio for android learning (二十六 )自定义控件理解与浅析(1)
  9. vs2019键盘钩子_江门网站建设:针对Web开发人员的12个最佳Visual Studio代码扩展
  10. linux 启动u盘引导,U盘启动引导安装linux
  11. 图解算法:八大排序算法
  12. bin文件转化为csv文件
  13. 04:AD采样【MSP430F5529】
  14. python简单好玩的代码_Python 趣味打怪:147 段简单代码助你从入门到大师
  15. 手机测试陨石软件,鉴定陨石真伪的简单测试方法
  16. Scrum板与Kanban如何抉择?kdliihoap板与按照xhvrcr
  17. WebRTC收集网卡地址信息 源码剖析
  18. 解决VBE6EXT.OLB不能被加载问题
  19. Matplotlib 箱线图
  20. 一、注册功能怎么测试

热门文章

  1. MFC里ON_COMMAND_RANGE消息映射的ID问题
  2. 区块链膨胀:以太坊客户如何解决存储问题
  3. 区块链赚钱的9种方式
  4. quickselect_QuickSelect:使用代码示例解释的快速选择算法
  5. Webhooks上的一个简单方法:恐吓现在停止
  6. 代码简介:向圣诞老人和他的精灵学习Google Analytics(分析)
  7. OpenStack环境搭建(二:Fuel Master的安装及配置)
  8. 限制HTTP数据包发送Referer
  9. 1073 Scientific Notation
  10. Python未来的发展趋势怎么样