1. /*
  2. 给定n个数据中心,m份资料,每份资料在其中的两个中心备份,一天可供下载的时间是h小时
  3. 中心i在第hi小时需要维护,无法下载
  4. 现在要将一些中心的维护时间往后推1小时,使得任意时刻每份资料都可以被下载,请问最少选择多少个数据中心,
  5.  
  6. 某个中心维护时,在其中资料无法下载,必须到其他点下载,
  7. 如果该点对应的点也在维护,那么这个对应点的维护必须往后推
  8. 对应点往后推时继续和其余点矛盾,那么其余点也要往后
  9.  
  10. 所以,如果同一份数据的两个点相隔一小时,那么这两个点要么不推迟,要推迟就要一起推迟,
  11.  
  12. 建立模型:点x和点y有相同的资料,并且hx+1==hy,那么加有向边(x,y)
  13. 最后得到的图中,一个强连通分量内的所有点必须一起选择
  14. 缩点构成DAG,选择出度为0的点即可
  15. */
  16. #include<bits/stdc++.h>
  17. using namespace std;
  18. #define maxn 100005
  19. struct Edge{int to,nxt;}edge[maxn<<];
  20. int n,m,t,h[maxn],head[maxn],tot,d[maxn][];
  21.  
  22. int c[maxn],low[maxn],dfn[maxn],stk[maxn],ins[maxn],ind,top;
  23. int cnt;
  24. vector<int>scc[maxn];
  25. void tarjan(int x){
  26. dfn[x]=low[x]=++ind;
  27. stk[++top]=x;ins[x]=;
  28. for(int i=head[x];i!=-;i=edge[i].nxt){
  29. int y=edge[i].to;
  30. if(!dfn[y]){//树枝边
  31. tarjan(y);
  32. low[x]=min(low[x],low[y]);
  33. }
  34. else if(ins[y])//后向边
  35. low[x]=min(low[x],dfn[y]);
  36. }
  37. if(dfn[x]==low[x]){
  38. cnt++;
  39. int y;
  40. do{
  41. y=stk[top--];
  42. ins[y]=;
  43. c[y]=cnt;scc[cnt].push_back(y);
  44. }while(x!=y);
  45. }
  46. }
  47.  
  48. void init(){
  49. tot=;
  50. memset(head,-,sizeof head);
  51. }
  52. void addedge(int u,int v){
  53. edge[tot].nxt=head[u];
  54. edge[tot].to=v;
  55. head[u]=tot++;
  56. }
  57. int in[maxn],out[maxn];
  58. int main(){
  59. init();
  60. cin>>n>>m>>t;
  61. for(int i=;i<=n;i++)scanf("%d",&h[i]);
  62. for(int i=;i<=m;i++)scanf("%d%d",&d[i][],&d[i][]);
  63. for(int i=;i<=m;i++){//建图
  64. if((h[d[i][]]+)%t==h[d[i][]])
  65. addedge(d[i][],d[i][]);
  66. if((h[d[i][]]+)%t==h[d[i][]])
  67. addedge(d[i][],d[i][]);
  68. }
  69. for(int i=;i<=n;i++)
  70. if(!dfn[i])
  71. tarjan(i);
  72. for(int x=;x<=n;x++)
  73. for(int i=head[x];i!=-;i=edge[i].nxt){
  74. int y=edge[i].to;
  75. if(c[x]==c[y])continue;
  76. in[c[y]]++;out[c[x]]++;
  77. }
  78. int ans=0x3f3f3f3f,k;
  79. for(int i=;i<=cnt;i++)
  80. if(out[i]== && scc[i].size()<ans)
  81. k=i,ans=scc[i].size();
  82. cout<<ans<<endl;
  83. for(int i=;i<scc[k].size();i++)
  84. printf("%d ",scc[k][i]);
  85. }

cf949C 建模,SCC缩点的更多相关文章

  1. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

  2. bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp

    一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...

  3. HDU 3072--Intelligence System【SCC缩点新构图 &amp;&amp; 求连通全部SCC的最小费用】

    Intelligence System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. UVA11324 The Lagest Lique(SCC缩点+DP)

    Given a directed graph G, con- sider the following transformation. First, create a new graph T(G) to ...

  5. POJ 2186 Popular cows(SCC 缩点)

    Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10, ...

  6. P2746 P2812 [USACO5.3]校园网Network of Schools[SCC缩点]

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作"接受学校").注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学 ...

  7. 洛谷P2341 [HAOI2006]受欢迎的牛 (Tarjan,SCC缩点)

    P2341 [HAOI2006]受欢迎的牛|[模板]强连通分量 https://www.luogu.org/problem/P2341 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就 ...

  8. bzoj 1179 [Apio2009]Atm——SCC缩点+spfa

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1179 显然SCC缩点. 然后准备倒着拓扑序推到st,结果WA. 听TJ说dj求最长路会发生不 ...

  9. 洛谷 P6030 - [SDOI2012]走迷宫(高斯消元+SCC 缩点)

    题面传送门 之所以写个题解是因为题解区大部分题解的做法都有 bug(u1s1 周六上午在讨论区里连发两个 hack 的是我,由于我被禁言才让 ycx 代发的) 首先碰到这种期望题,我们套路地设 \(d ...

随机推荐

  1. valgrind 开发板调试

    1.http://www.360doc.com/content/13/1205/13/7256015_334661588.shtml

  2. 【blog】SpringBoot普通类中如何获取其他bean例如Service、Dao

    自己写工具类 工具类 import org.springframework.beans.BeansException; import org.springframework.context.Appli ...

  3. pythonの递归锁

    首先看一个例子,让我们lock = threading.Lock() 时(代码第33行),程序会卡死在这里 #!/usr/bin/env python import threading,time de ...

  4. python第二天,list和tuple

    概念:list是集合,且是可变集合,tuple是元组集合,不可变集合. 1.Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 主要知识点:初始化 ...

  5. JAVA并行异步编程,线程池+FutureTask

    java 在JDK1.5中引入一个新的并发包java.util.concurrent 该包专门为java处理并发而书写. 在java中熟悉的使用多线程的方式为两种?继续Thread类,实现Runnal ...

  6. LwIP Application Developers Manual11---Initializing lwIP

    1.前言 2.Initialization for simple lwIP 查看doc/rawapi.txt来获得更多官方信息 #if NO_SYS /* Network interface vari ...

  7. LwIP Application Developers Manual4---传输层之UDP、TCP

    1.前言 本文主要讲解传输层协议UDP TCP 2.UDP 2.1 UDP from an application perspective 2.2 UDP support history in lwI ...

  8. Node.js WEB服务器(1)——编写简单的HTTP服务器

    基于分而治之的思想,很多架构都会采用分层的模式来处理某类应用.Node.js在Web开发上也是采用这种模式,分别提供了如下的三个层: Node核心 社区模块 应用逻辑 下面是一个最简形式的web服务器 ...

  9. python模块之sniffio

    嗅探python用了哪个异步库 from sniffio import current_async_library import trio import asyncio async def print ...

  10. 设计模式C++学习笔记之二十(完结篇 & 面向对象原则)设计模式C++实例下载

      Prototype(原型模式) 20.1.解释 概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. main(),客户 ICloneableNow,只有一个接口Clone CM ...