Codeforces 950E Data Center Maintenance 强连通分量
题目链接
题意
有\(n\)个信息中心,每个信息中心都有自己的维护时间\((0\leq t\lt h)\),在这个时刻里面的信息不能被获得。
每个用户的数据都有两份备份,放在两个相异的信息中心(维护时间也相异)。
现要挑选出信息中心的一个尽量小的子集,使得将这个子集的维护时间向后推移一个小时后,不会导致问题(存在一个用户,其数据所在的两个信息中心维护时间相同)。
思路
强连通分量
考虑每个用户的信息存放的两个信息中心,\(u,v\):
如果调整其中任何一个的时间不会导致与另外一个产生冲突,就说明是安全的;
否则若\(u\)调整后与\(v\)产生冲突,则一旦调整\(u\)就必须调整\(v\),于是加一条边\(<u,v>\).
在得到的图上跑\(tarjan\)再缩点后得到强连通分量,答案就是新的图中 出度为\(0\)的并且\(size\)最小 的一块\(SCC\)。道理显然。
Code
#include <bits/stdc++.h>
#define F(i, a, b) for (int i = (a); i < (b); ++i)
#define F2(i, a, b) for (int i = (a); i <= (b); ++i)
#define dF(i, a, b) for (int i = (a); i > (b); --i)
#define dF2(i, a, b) for (int i = (a); i >= (b); --i)
#define maxn 100010
using namespace std;
typedef long long LL;
int dfn[maxn], low[maxn], ne[maxn], belong[maxn], a[maxn], sz[maxn], scc, cnt, tot, outd[maxn];
stack<int> s;
bool in[maxn];
struct Edge { int from, to, ne; }edge[maxn<<1];
void add(int u, int v) {
edge[tot] = {u, v, ne[u]};
ne[u] = tot++;
}
void tarjan(int u) {
dfn[u] = low[u] = ++cnt;
in[u] = true;
s.push(u);
for (int i = ne[u]; ~i; i = edge[i].ne) {
int v = edge[i].to;
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (in[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u]==dfn[u]) {
++scc;
while (true) {
int v = s.top(); in[v] = false; s.pop();
belong[v] = scc; ++sz[scc];
if (u==v) break;
}
}
}
void contrast() {
F(i, 0, tot) {
int u = edge[i].from, v = edge[i].to;
if (belong[u]==belong[v]) continue;
++outd[belong[u]];
}
}
int main() {
memset(ne, -1, sizeof ne);
int n, m, h, u, v;
scanf("%d%d%d", &n, &m, &h);
F2(i, 1, n) scanf("%d", &a[i]);
F(i, 0, m) {
scanf("%d%d", &u,&v);
if (a[u]>a[v]) swap(u, v);
if (a[v]-a[u]==1) add(u, v);
if (a[v]-a[u]==h-1) add(v, u);
}
F2(i, 1, n) if (!dfn[i]) tarjan(i);
contrast();
int ans=n+1, p=-1;
F2(i, 1, scc) {
if (!outd[i]) {
if (sz[i]<ans) ans=sz[i], p=i;
}
}
printf("%d\n", ans);
F2(i, 1, n) if (belong[i]==p) printf("%d ", i); puts("");
return 0;
}
Codeforces 950E Data Center Maintenance 强连通分量的更多相关文章
- Codeforces 950E Data Center Maintenance ( 思维 && 强连通分量缩点 )
题意 : 给出 n 个点,每个点有一个维护时间 a[i].m 个条件,每个条件有2个点(x,y)且 a[x] != a[y].选择最少的 k (最少一个)个点,使其值加1后,m个条件仍成立. 分析 : ...
- codeforces 949C - Data Center Maintenance【tarjan】
首先转换图论模型,把某个客户一个终端的维修时间(+1)%h之后和另一个终端维修时间一样,这样的两个终端连一条有向边,表示推后一个终端就必须推后另一个 然后tarjan缩点,一个scc里的终端是要一起推 ...
- Codeforces 949C(Data Center Maintenance,Tarjan缩点)
难度系数:1900 graphs 题意:有 n 个银行,m 个客户,每个客户都把自己的资料放在 2 个银行,一天总共有 h 小时,每个银行每天都要维护一小时,这一小时内银行无法工作,但是这一小时客户仍 ...
- 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,要求这两个数据中心不能同时维护. 现在要挑出一个数据中心的子集,把他们的维护时间都推后 ...
- CF949C Data Center Maintenance(建图+强联通分量)
题意 有 n 个信息中心,第 i 个信息中心要在第 ti 个小时维护,维护期间信息不能被获得. 每个用户的数据都有两份备份,第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2). 现在要挑 ...
- [CF949C]Data Center Maintenance
题目大意:$n$个点,每个点有一个值$w_i$.$m$个条件,每个条件给出$x,y$,要求$w_x\not =w_y$.选择最少的点,使其值加$1$后,所有条件成立(数据保证有解). 题解:对于每个条 ...
- Data Center Maintenance CodeForces - 950E
http://codeforces.com/contest/950/problem/E 贴一份板子 #include<cstdio> #include<vector> #inc ...
随机推荐
- MySQL☞dual虚拟表
Dual表:虚拟表,专门用来测试各种函数:(本来以为跟Oracle中的dual表一样,发现还是不太一样)
- CCF-NOIP-2018 提高组(复赛) 模拟试题(四)
T1 贪吃蛇 [问题描述] 贪吃蛇是一个好玩的游戏.在本题中,你需要对这个游戏进行模拟. 这个游戏在一个 \(n\) 行 \(m\) 列的二维棋盘上进行. 我们用 \((x, y)\) 来表示第 \( ...
- python 动态函数调用及可变参数传入
定义类及方法 class ParameterFactory(object): ..... def fullLinkTag(self, fromDate, toDate, status, cate='全 ...
- [ecmagnet][django] 如何使用django的signal
""" 在web开发中, 你可能会遇到下面这种场景: 在用户完成某个操作后, 自动去执行一些后续的操作. 譬如用户完成修改密码后,你要发送一份确认邮件 观察者模式:观察者 ...
- 配置Android应用开发环境
详解JRE.JDK.SDK.ADT请点击辨析ADK&JVM&JRE&JDK&ADT 一.安装JDK 开发 Android应用程序的时候,仅有Java运行环境(Java ...
- eclipse版本命名规则与其他软件命名
文章:Eclipse各版本代号一览表 eclipse使用星球.神话人物.元素名称作为命名代号. 所以思路要放宽,不要拘泥于已有经验. java是用咖啡命名的: python中文意思是蟒蛇: 不拘泥于已 ...
- Android调用Java WebSevice篇之一
一.服务端WebService 1.服务端环境配置 MyEclipse 10.0.Tomcat6.0.JDK6.0. 2.下载axis相关jar包. 3.创建webservice. ...
- 【EasyNetQ】- 订阅
EasyNetQ订阅者订阅消息类型(消息类的.NET类型).一旦通过调用Subscribe方法设置了对类型的订阅,就会在RabbitMQ代理上创建一个持久队列,并且该类型的任何消息都将被放置在队列中. ...
- 微信小程序小程序使用scroll-view不能使用下拉刷新的解决办法
<scroll-view class="movie-grid-container" scroll-y="true" scroll-x="fals ...
- NIO Q&A(持续补充。。。。)
Q:NIO是非阻塞的.但调用的selector.select()方法会阻塞.这和NIO非阻塞岂不是矛盾了? A:非阻塞指的是 IO 事件本身不阻塞,但是获取 IO 事件的 select 方法是需要阻塞 ...