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里的终端是要一起推 ...
随机推荐
- 如何突破JAVA程序员三年的门槛
第一阶段:三年 我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本 上的内容迈向真正的企业级开发.我们知道如何团 ...
- AlexNet神经网络结构
Alexnet是2014年Imagenet竞赛的冠军模型,准确率达到了57.1%, top-5识别率达到80.2%. AlexNet包含5个卷积层和3个全连接层,模型示意图: 精简版结构: conv1 ...
- 在Blender上安装RenderMan插件
2018/3/27 Download and Install Blender itself Download RenderMan Installer (Need to register an acco ...
- INIT: vesion 2.88 booting
/***************************************************************************** * INIT: vesion 2.88 b ...
- (一)mvc与mvvm设计模式
前沿:了解设计模式对我们而言,具有很大意义,对语言没有限制,它适用于任何语言,是一种变成思想.设计模式最初有四人帮提出,有兴趣的同学可以去了解下,今天给大家主要分析mvc与mvvm设计模式 一.mvc ...
- 解决get方法传递URL参数中文乱码问题
[转]解决get方法传递URL参数中文乱码问题 来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下, ...
- is is not == !=之间的区别
简单来说,python中的is与is not运算符可判断两个对象是否为同一对象.若为同一个对象,则对象1 is 对象2为True .反正,若非同一个对象,则对象1 is not 对象2为True 要理 ...
- Vant async-validator 表单校验
感谢:尤大大的 vue.有赞的 vant.async-validator.以及 asseek 链接:https://www.jianshu.com/p/d58fe749b97f 在下不才在 assee ...
- 【Xamarin】MonoTouch - iOS 使用 UIImagePickerController 打开图片库和相机选择图片修改头像
Application tried to present modally an active controller <UIImagePickerController: 0x7b6ff400> ...
- npm包的发布
假设该待发布包在你本地的项目为 project1 包的本地安装测试 在发布之前往往希望在本地进行安装测试.那么需要一个其他的项目来本地安装待发布项目. 假设该其他项目为project2.假设proje ...