题意:

有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. ng 自定义服务

    服务的本质是对象. 创建服务的常见方式:factory(返回对象) service (方法.属性)constant(常量服务) value(变量服务) 1.factoryapp.factory('服务 ...

  2. SqlServer 数据库/数据表 拆分(分布式)【转】

    通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器 ...

  3. 如何移除双系统mac中的windows系统

    双系统 双系统即在电脑的不同分区中安装两个系统,两个系统不会互相影响,但是同时只能有一个系统正在运行,并且必须通过重启的方式来更换系统. 双系统一般由于解决对不同系统的需求,而且在电脑中直接安装系统也 ...

  4. 转发一篇关于django模型详解的一篇好的博客

    http://blog.csdn.net/pipisorry/article/details/45725953

  5. java 执行JavaScript 以及容器化的问题

    1. 可选方案     a. jdk 6 开始内置的Rhino 引擎   b. jdk8 替换的nashorn (性能高,对于ECMA 支持更好)   c. java 版的nodejs vertx.i ...

  6. ubantu 虚拟机无法查看windows共享目录

    初学linux,安装好虚拟机,安装好ubantu系统,启动系统后无法查看windows共享目录. 原因是没有安装 vmware tools 教程地址:http://www.linuxidc.com/L ...

  7. FIR滤波器相关解释

    LTI(Linear Time-Invariant) 线性时不变: 线性时不变系统是根据系统输入和输出是否具有线性关系来定义的.满足叠加原理的系统具有线性特性.线性满足y=kx函数. 根据系统的输入和 ...

  8. php小算法总结一(数组重排,进制转换,二分查找)

    1.两个有序数组组合成一个新的有序数组 <?php $arr1=array(2,5,7,9,12); $arr2=array(3,4,6,8,10,11); function merge_sor ...

  9. oracle数据库查询题目!!!!!我的最爱

    使用scott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下 emp员工表(empno员工号/ename员工姓名/job工作/mgr上级编号/hiredate受雇日期/sal薪 ...

  10. AngularJS:template

    ylbtech-AngularJS: 1.返回顶部 1.   2. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9 ...