[CF949C]Data Center Maintenance

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

题解:对于每个条件,若$(w_x+1)\bmod h=w_y$,连上$x->y$;若$(w_y+1)\bmod h=w_x$,连上$y->x$。一条边的含义是,若起点加一,终点也要加一。缩点,强连通分量内的点要一起加。发现答案就是找最小的没有出边的点

卡点:

C++ Code:

#include <cstdio>
#define maxn 100010
#define maxm maxn
#define gethour(x) ((x + 1) % h)
int n, m, h;
int w[maxn];

int head[maxn << 1], cnt;
struct Edge {
	int from, to, nxt;
} e[maxm << 2];
inline void addE(int a, int b) {
	e[++cnt] = (Edge) {a, b, head[a]}; head[a] = cnt;
}

int DFN[maxn], low[maxn], idx, sz[maxn];
int S[maxn], top, res[maxn], CNT;
bool ins[maxn];
inline int min(int a, int b) {return a < b ? a : b;}
void tarjan(int u) {
	DFN[u] = low[u] = ++idx;
	ins[S[++top] = u] = true;
	int v;
	for (int i = head[u]; i; i = e[i].nxt) {
		v = e[i].to;
		if (!DFN[v]) {
			tarjan(v);
			low[u] = min(low[u], low[v]);
		} else if (ins[v]) low[u] = min(low[u], DFN[v]);
	}
	if (DFN[u] == low[u]) {
		CNT++;
		do {
			ins[v = S[top--]] = false;
			sz[res[v] = CNT]++;
			addE(CNT + n, v);
		} while (u != v);
	}
}

int oud[maxn];
int main() {
	scanf("%d%d%d", &n, &m, &h);
	for (int i = 1; i <= n; i++) scanf("%d", w + i);
	for (int i = 0, a, b; i < m; i++) {
		scanf("%d%d", &a, &b);
		if (w[a] == gethour(w[b])) addE(b, a);
		if (w[b] == gethour(w[a])) addE(a, b);
	}
	int cnt_now = cnt;
	for (int i = 1; i <= n; i++) if (!DFN[i]) tarjan(i);
	for (int i = 1; i <= cnt_now; i++) {
		int u = e[i].from, v = e[i].to;
		if (res[u] != res[v]) oud[res[u]]++;
	}
	int ans = 0x3f3f3f3f, mini = n + 1;
	for (int i = 1; i <= CNT; i++) if (!oud[i] && ans > sz[i]) {
		ans = sz[i];
		mini = i + n;
	}
	printf("%d\n", ans);
	for (int i = head[mini]; i; i = e[i].nxt) printf("%d ", e[i].to);
	puts("");
	return 0;
}

  

原文地址:https://www.cnblogs.com/Memory-of-winter/p/9745756.html

时间: 2024-10-25 18:04:56

[CF949C]Data Center Maintenance的相关文章

CF949C Data Center Maintenance Tarjan找强连通分量

题意 给你\(n\)个点,每个点有一个权值\(a_x\),有\(m\)个限制条件形如\(a_x≠a_y\),现在要求你选出\(k(k>0)\)个点使其权值在模\(h\)意义下加\(1\),问最少选多少个点能让限制条件继续满足. \(Tarjan\)求强连通分量模板题 发现对于每个限制条件,如果\(a_x+1=a_y(mod\ h)\) 那么可以给\(y\)向\(x\)连一条有向边 那么最后缩点后找到入度为\(0\)的最小\(scc\)大小即可 Codes #include <cstdio>

CF949C Data Center Maintenance(建图+强联通分量)

题意 有 n 个信息中心,第 i 个信息中心要在第 ti 个小时维护,维护期间信息不能被获得. 每个用户的数据都有两份备份,第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2). 现在要挑选一个尽量小的信息中心集合,使得将这个集合的维护时间推迟一个小时后,仍然能保证每个用户的数据在任意时刻都能获得. n≤100000 题解 对于每对 c(i,1),c(i,2),若调整 c(i,1) 后与 c(i,2) 的维护时间冲突,则连边 (c(i,1), c(i,2) ) 对于 c(i,2),c

CF949 C Data Center Maintenance——边双连通分量

题目:http://codeforces.com/contest/949/problem/C 把一个点指向修改它会影响到的点就可以做了: 有取模,所以多出一些要注意的地方,首先是可能出现环,所以需要 tarjan 求边双: 其次,边集数组的大小应该开成两倍,因为取模可能导致一对 ci 互相连边: 然后找出不影响别的点的.最小的边双,输出即可: 而我竟然把 tarjan 都少写了一个 top-- !真是对自己无语了... 代码如下: #include<iostream> #include<

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

题目:http://codeforces.com/contest/949/problem/C 可以想到可能是每组c有连边的可能. 但别直接给c1.c2连边,那样之后会变得很不好做. 可以把一些限制放在连边这个环节上. 也就是只有(c1+1)%h==c2才从c1向c2连边表示选了c1必须选c2!c2向c1也是一样. 然后缩个点找无出度的最小的点就行了. 边注意开成两倍--一组c也可能连两条边,%2之类的. #include<iostream> #include<cstdio> #in

Data Center手册(2): 安全性

有个安全性有下面几种概念: Threat:威胁 Vulnerability: 安全隐患 Attack: 攻击 有关Threat 常见的威胁有下面几种 DoS(Denial of Service拒绝服务攻击) Breach of confidential information 破解机密信息 Data theft or alteration 数据盗用和篡改 Unauthorized use of compute resources 未授权访问 Identity theft 身份盗用 有关安全隐患

Data Center Group

Data Center Group||----Sr. Admin Assistant|----Technical Assistant|----Executive Assistant||--Enterprise & HPC platform Group--Cloud Platforms Group--Network Platform Group--Health& Life Sciences--Silicon Photonics Solutions Group--Storage Group||

Data Center手册(4):设计

基础架构 拓扑图 Switching Path L3 routing at aggregation layer L2 switching at access layer L3 switch融合了三种功能: RP, router processor, 处理路由协议 SP, switch processor, 处理L2协议 ASIC, Application-specific integrated circuit专用集成电路,用于重写header的 对于traffic forwarding有几种方法

Codeforces Gym 100513D D. Data Center 前缀和 排序

D. Data Center Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/560/problem/B Description The startup "Booble" has shown explosive growth and now it needs a new data center with the capacity of m petabytes. Booble can b

Data Center手册(1):架构

如图是数据中心的一个基本架构 最上层是Internet Edge,也叫Edge Router,也叫Border Router,它提供数据中心与Internet的连接. 连接多个网络供应商来提供冗余可靠的连接 对外通过BGP提供路由服务,使得外部可以访问内部的IP 对内通过iBGP提供路由服务,使得内部可以访问外部IP 提供边界安全控制,使得外部不能随意访问内部 控制内部对外部的访问 为了HA的需要,往往会有两个Border Router Typical enterprise Internet c