题意:

有n个数据中心,m个客户,每天有h个小时,其中 n,m,h<=100000。每个数据中心i每天都会有一个数据维护的时间0<=u[i]<=h-1,在数据中心维护期间时不可以使用的。每个客户都选择两个不同的数据中心,以保证每天的数据使用不间断。保证初始时符合要求。找出最少的数据中心数,使每个数据中心的维护时间推迟一个小时(若u[i]<h-1推迟一小时变为u[i]+1,否则变为0),每个客户都能正常使用。

分析:

我们发现,只要每个客户选择的两个数据中心的维护时间不同就符合题目的要求。如果其中一个刚好比另一个提前一个小时,那么如果要推迟这一个显然不符合要求。我们就可以建一个图,若某个客户的两个数据中心i,j中的一个可以通过推迟一小时使得u[i]=u[j],那么就从i到j连一条有向边。然后tarjan缩点,我们会发现,我们只要找出缩点后的图中所有出度为0的联通分量中点数最少的,这就是答案。插一句···tarjan曾经是中学的我“背”的最熟的代码之一

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
const int maxn=+;
const int INF=;
vector<int>G[maxn];
vector<int>SCC[maxn];
int u[maxn],c[maxn][];
int in[maxn];
int n,m,h;
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
stack<int>S;
void dfs(int u){
pre[u]=lowlink[u]=++dfs_clock;
S.push(u);
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(!pre[v]){
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}else if(!sccno[v]){
lowlink[u]=min(lowlink[u],pre[v]);
}
}
if(lowlink[u]==pre[u]){
scc_cnt++;
SCC[scc_cnt].clear();
for(;;){
int x=S.top();S.pop();
sccno[x]=scc_cnt;
SCC[scc_cnt].push_back(x);
if(x==u)break;
}
}
}
void find_scc(int n){
dfs_clock=scc_cnt=;
memset(sccno,,sizeof(sccno));
memset(pre,,sizeof(pre));
for(int i=;i<=n;i++)
if(!pre[i])dfs(i);
}
int main(){
scanf("%d%d%d",&n,&m,&h);
for(int i=;i<=n;i++)scanf("%d",&u[i]);
for(int i=;i<=m;i++){
scanf("%d%d",&c[i][],&c[i][]);
if(u[c[i][]]>u[c[i][]])swap(c[i][],c[i][]);
if(u[c[i][]]+==u[c[i][]])
G[c[i][]].push_back(c[i][]);
if(u[c[i][]]==&&u[c[i][]]==h-)
G[c[i][]].push_back(c[i][]);
}
find_scc(n);
int ans=;
int Min=INF; for(int i=;i<=n;i++){
for(int j=;j<G[i].size();j++){
int v=G[i][j];
if(sccno[i]!=sccno[v])
in[sccno[i]]++;
}
} for(int i=;i<=scc_cnt;i++){
if(!in[i]){
if(Min>SCC[i].size()){
Min=SCC[i].size();
ans=i;
}
}
}
printf("%d\n",Min);
for(int i=;i<SCC[ans].size();i++)
printf("%d ",SCC[ans][i]);
return ;
}

codeforce469DIV2——E. Data Center Maintenance的更多相关文章

  1. Codeforces 950.E Data Center Maintenance

    E. Data Center Maintenance time limit per test 1 second memory limit per test 512 megabytes input st ...

  2. Codeforces Round #469 (Div. 1) 949C C. Data Center Maintenance (Div. 2 950E)

    题 OvO http://codeforces.com/contest/949/problem/C codeforces 949C 950E 解 建图,记原图为 G1,缩点,记缩完点后的新图为G2 缩 ...

  3. Codeforces Round #469 (Div. 2) E. Data Center Maintenance

    tarjan 题意: 有n个数据维护中心,每个在h小时中需要1个小时维护,有m个雇主,他们的中心分别为c1,c2,要求这两个数据中心不能同时维护. 现在要挑出一个数据中心的子集,把他们的维护时间都推后 ...

  4. Codeforces 950E Data Center Maintenance 强连通分量

    题目链接 题意 有\(n\)个信息中心,每个信息中心都有自己的维护时间\((0\leq t\lt h)\),在这个时刻里面的信息不能被获得. 每个用户的数据都有两份备份,放在两个相异的信息中心(维护时 ...

  5. CF 949C Data Center Maintenance——思路+SCC

    题目:http://codeforces.com/contest/949/problem/C 可以想到可能是每组c有连边的可能. 但别直接给c1.c2连边,那样之后会变得很不好做. 可以把一些限制放在 ...

  6. [CF949C]Data Center Maintenance

    题目大意:$n$个点,每个点有一个值$w_i$.$m$个条件,每个条件给出$x,y$,要求$w_x\not =w_y$.选择最少的点,使其值加$1$后,所有条件成立(数据保证有解). 题解:对于每个条 ...

  7. cf950e Data Center Maintenance

    若推迟 \(u\) 必推迟 \(v\),则连边 <\(u,v\)>. 求强联通分量后缩点,答案显然是出度为 \(0\) 且 size 最小的 scc. #include <iostr ...

  8. Data Center Maintenance CodeForces - 950E

    http://codeforces.com/contest/950/problem/E 贴一份板子 #include<cstdio> #include<vector> #inc ...

  9. codeforces 949C - Data Center Maintenance【tarjan】

    首先转换图论模型,把某个客户一个终端的维修时间(+1)%h之后和另一个终端维修时间一样,这样的两个终端连一条有向边,表示推后一个终端就必须推后另一个 然后tarjan缩点,一个scc里的终端是要一起推 ...

随机推荐

  1. 演示使用Metasploit入侵Android

    文本演示怎么使用Kali Linux入侵Android手机. Kali Linux IP地址:192.168.0.112:接收连接的端口:443. 同一局域网内android手机一部(android ...

  2. 深入理解java虚拟机-第六章

    第6章 类文件 6.3 Class类文件的结构 Class文件是一组以8位字节为基础单位的二进制流. Class文件格式采用一种类似C语言结构伪结构存储数据,这种伪结构中只有两种数据类型:无符号数和表 ...

  3. 微软SaaS多租户解决方案

    微软SaaS多租户解决方案 docs.microsoft.com/en-us/azure/sql-database/saas-tenancy-app-design-patterns https://d ...

  4. Struts2常用标签总结

    Struts2常用标签总结 一 介绍 1.Struts2的作用 Struts2标签库提供了主题.模板支持,极大地简化了视图页面的编写,而且,struts2的主题.模板都提供了很好的扩展性.实现了更好的 ...

  5. 在oracle里,如何取得本周、本月、本季度、本年度的第一天和最后一天的时间

    在oracle里,如何取得本周.本月.本季度.本年度的第一天和最后一天的时间 --本周 select trunc(sysdate,'d')+1 from dual; select trunc(sysd ...

  6. 重温CLR(八 ) 泛型

    熟悉面向对象编程的开发人员都深谙面向对象的好处,其中一个好处是代码重用,它极大提高了开发效率.也就是说,可以派生出一个类,让他继承基类的所有能力.派生类只需要重写虚方法,或添加一些新方法,就可定制派生 ...

  7. SCARA——OpenGL入门学习一、二

    参考博客:http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 简介 最近开始一个机械手臂的安装调试,平面关节型机器人又称SCA ...

  8. 04:sqlalchemy操作数据库 不错

    目录: 1.1 ORM介绍(作用:不用原生SQL语句对数据库操作) 1.2 安装sqlalchemy并创建表 1.3 使用sqlalchemy对表基本操作 1.4 一对多外键关联 1.5 sqlalc ...

  9. eclipse “”base revision” vs. “latest from repository”

    base revision(基本版本):代表的是最近一次从svn服务器上面获取的版本内容:本质还是本地版本,只不过这个版本是上次从服务器上面获取的. lastest from resource(资源库 ...

  10. jinja2的一些用法

    1.split用法以及乘法运算 {% set user_list=l.users.split(',') %} <tr> <td>{{ l.name }}</td> ...