codeforce469DIV2——E. Data Center Maintenance
题意:
有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的更多相关文章
- Codeforces 950.E Data Center Maintenance
E. Data Center Maintenance time limit per test 1 second memory limit per test 512 megabytes input st ...
- 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 缩 ...
- Codeforces Round #469 (Div. 2) E. Data Center Maintenance
tarjan 题意: 有n个数据维护中心,每个在h小时中需要1个小时维护,有m个雇主,他们的中心分别为c1,c2,要求这两个数据中心不能同时维护. 现在要挑出一个数据中心的子集,把他们的维护时间都推后 ...
- Codeforces 950E Data Center Maintenance 强连通分量
题目链接 题意 有\(n\)个信息中心,每个信息中心都有自己的维护时间\((0\leq t\lt h)\),在这个时刻里面的信息不能被获得. 每个用户的数据都有两份备份,放在两个相异的信息中心(维护时 ...
- CF 949C Data Center Maintenance——思路+SCC
题目:http://codeforces.com/contest/949/problem/C 可以想到可能是每组c有连边的可能. 但别直接给c1.c2连边,那样之后会变得很不好做. 可以把一些限制放在 ...
- [CF949C]Data Center Maintenance
题目大意:$n$个点,每个点有一个值$w_i$.$m$个条件,每个条件给出$x,y$,要求$w_x\not =w_y$.选择最少的点,使其值加$1$后,所有条件成立(数据保证有解). 题解:对于每个条 ...
- cf950e Data Center Maintenance
若推迟 \(u\) 必推迟 \(v\),则连边 <\(u,v\)>. 求强联通分量后缩点,答案显然是出度为 \(0\) 且 size 最小的 scc. #include <iostr ...
- Data Center Maintenance CodeForces - 950E
http://codeforces.com/contest/950/problem/E 贴一份板子 #include<cstdio> #include<vector> #inc ...
- codeforces 949C - Data Center Maintenance【tarjan】
首先转换图论模型,把某个客户一个终端的维修时间(+1)%h之后和另一个终端维修时间一样,这样的两个终端连一条有向边,表示推后一个终端就必须推后另一个 然后tarjan缩点,一个scc里的终端是要一起推 ...
随机推荐
- 记一次诡异的网络故障排除 - tpc_tw_recycle参数引起的网络故障
一.故障现象 我们团队访问腾讯云上部署的测试环境中的Web系统A时,偶尔会出现类似于网络闪断的情况,浏览器卡很久没有反应,最终报Connection Timeout. 不过奇怪的是,当团队中的某个人无 ...
- 《DSP using MATLAB》示例Example7.19
代码: M = 33; alpha = (M-1)/2; Dw = 2*pi/M; l = 0:M-1; wl = Dw*l; %Hdr = [0, 0, 1, 1]; wdl = [0, 0.6, ...
- 【spring源码学习】spring的事件发布监听机制源码解析
[一]相关源代码类 (1)spring的事件发布监听机制的核心管理类:org.springframework.context.event.SimpleApplicationEventMulticast ...
- 【BZOJ2850】巧克力王国 KDtree
[BZOJ2850]巧克力王国 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜 欢过于甜的巧克力.对于每一块巧克力,我们设 ...
- 学习动态性能表(2)--v$sesstat
学习动态性能表 第二篇--v$sesstat 2007.5.25 按照OracleOnlineBook中的描述,v$sesstat存储session从login到logout的详细资源使用统计. 类 ...
- PADS Router 虚焊盘显示怎么办?
PADS Router 虚焊盘显示怎么办? 群里朋友有问不知道按了什么键,焊盘显示成以下这种,怎么还原? 解答比较简单,按个 T 就可以. 这个显示是有好处的,特别是焊盘有过孔时一眼就看到.
- 前端mvc mvp mvvm 架构介绍(vue重构项目一)
首先 我们为什么重构这个项目 1:我们现有的技术是前后台不分离,页面上采用esayUI+jq构成的单页面,每个所谓的单页面都是从后台胜场的唯一Id 与前端绑定,即使你找到了那个页面元素,也找不到所在的 ...
- Hibernate问题集锦: 概述
Hibernate问题集锦: 概述 ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.怎么配置hibernate? ...
- rmmod: can't change directory to '/lib/modules': No such file or directory
[root@iTOP-4412]# mount /dev/sda1 /mnt/udisk/ [root@iTOP-4412]# insmod /mnt/udisk/linux/hello.ko [ ...
- TPS和QPS区别
TPS和QPS区别 http://blog.csdn.net/kobejayandy/article/details/9374747