Codeforces 950E Data Center Maintenance ( 思维 && 强连通分量缩点 )
题意 : 给出 n 个点,每个点有一个维护时间 a[i]。m 个条件,每个条件有2个点(x,y)且 a[x] != a[y]。选择最少的 k (最少一个)个点,使其值加1后,m个条件仍成立。
分析 :
发现改变某些数加一后可能产生联动效应
换句话说就是改变某些数则必须改变另一些数来维持 m 个条件的成立
这个可以用图来表示,对于给出来的每一个 (x, y) 如果改变 x 后等于 y 则连 x => y 边
表示要改变 x 则必须改变 y,然后对于 y 进行同样的判断是否连边
最后建完图后,若有成环的,则这个环上的点要加一改变,则环上所有点都必须进行改变
因此将整个图进行强连通分量缩点,最后考察所有出度为 0 的的分量,哪个分量点最少
则这个点集就是答案,出度不为 0 的点肯定不是最优的,因为这些点定会回到出度为 0 的点
#include<bits/stdc++.h>
using namespace std;
;
;
struct EDGE{ int v, nxt; }Edge[maxm];
int Head[maxn], cnt;
int DFN[maxn], LOW[maxn], color[maxn], INDEX, id;
bool vis[maxn], out[maxn];
stack<int> stk;
vector<int> num[maxn];
int N, M, H;
inline void init()
{
while(!stk.empty()) stk.pop();
; i<=N; i++){
Head[i] = DFN[i] = LOW[i] = color[i] = -;
out[i] = false;
num[i].clear();
}cnt = INDEX = id = ;
}
inline void AddEdge(int from, int to)
{
Edge[cnt].v = to;
Edge[cnt].nxt = Head[from];
Head[from] = cnt++;
}
inline void tarjan(int u)
{
DFN[u] = LOW[u] = INDEX++;
stk.push(u);
vis[u] = true;
; i=Edge[i].nxt){
int Eiv = Edge[i].v;
){
tarjan(Eiv);
LOW[u] = min(LOW[u], LOW[Eiv]);
}else{
if(vis[Eiv])
LOW[u] = min(LOW[u], LOW[Eiv]);
}
}
if(DFN[u] == LOW[u]){
color[u] = ++id;
num[id].push_back(u);;
vis[u] = false;
while(stk.top() != u){
vis[stk.top()] = false;
color[stk.top()] = id;
num[id].push_back(stk.top());
stk.pop();
}
stk.pop();
}
}
int arr[maxn];
int main(void)
{
scanf("%d %d %d", &N, &M, &H);
init();
; i<=N; i++)
scanf("%d", &arr[i]);
int u, v;
while(M--){
scanf("%d %d", &u, &v);
)%H == arr[v]) AddEdge(u, v);
)%H == arr[u]) AddEdge(v, u);
}
; i<=N; i++)
)
tarjan(i);///强连通分量缩点
; i<=id; i++){///统计缩点后每个点的出入度情况
; j<num[i].size(); j++){
u = num[i][j];
; k=Edge[k].nxt){
int Eiv = Edge[k].v;
if(color[Eiv] != i){
out[i] = true;
break;
}
}
if(out[i]) break;
}
}
int MM = 0x3f3f3f3f, which;
; i<=id; i++){
if(!out[i] && num[i].size() < MM){
MM = num[i].size();
which = i;
}
}
printf("%d\n", MM);
; i<=N; i++)
if(color[i] == which)
printf("%d ", i);
puts("");
;
}
Codeforces 950E Data Center Maintenance ( 思维 && 强连通分量缩点 )的更多相关文章
- Codeforces 950E Data Center Maintenance 强连通分量
题目链接 题意 有\(n\)个信息中心,每个信息中心都有自己的维护时间\((0\leq t\lt h)\),在这个时刻里面的信息不能被获得. 每个用户的数据都有两份备份,放在两个相异的信息中心(维护时 ...
- 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 ...
- POJ1236Network of Schools[强连通分量|缩点]
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16571 Accepted: 65 ...
- POJ1236Network of Schools(强连通分量 + 缩点)
题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...
- HD2767Proving Equivalences(有向图强连通分量+缩点)
题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...
- UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)
题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...
- ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)
题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...
随机推荐
- 【Qt开发】在QLabel已经显示背景图片后绘制图形注意事项
主要是要解决图形覆盖的问题,通常的办法就是对QLabel进行子类化,并重载函数: void myLabel::paintEvent(QPaintEvent *event) { QLab ...
- Go语言代码结构与语法基础(二)
任何一门语言,都是从打印 hello world 开始的. 最简单的go代码: package main // 声明 main 包,表明当前是一个可执行程序 import "fmt" ...
- 【字符串大模拟】潜伏者—— NOIP2009原题
洛谷连接 就一道黄题没啥可以说的……就是要细心…… 学到了神奇的优化 ios::sync_with_stdio(false); cin优化,能跑的比scanf快!棒!(不过要开std) 这题真的还挺简 ...
- 【6.18校内test】T2分数线划定
分数线划定[题目链接] 这道题也不是什么难题,思路一带而过吧: SOLUTION: First.输入n,m,计算m*1.5的值,接着输入编号和成绩,然后我的做法是在输入编号成绩之后,开一个101大小的 ...
- tp5后台同步更新配置文件
thinkphp5 配置文件路径:app/extra/web.php public function add(){ $path = 'app/extra/web.php'; $file = inclu ...
- 生成url的二维码图片
<?php require_once "./phpqrcode.php"; //生成二维码 $img = \QRcode::png("https://www.bai ...
- bind函数作用、应用场景以及模拟实现
bind函数 bind 函数挂在 Function 的原型上 Function.prototype.bind 创建的函数都可以直接调用 bind,使用: function func(){ consol ...
- 如何利用`keep-alive`按需缓存页面数据
随着项目不断变大,页面变多,搜索条件也随之也越来越多,而每次跳转页面再返回时,之前的筛选的条件都会别清空.之前在elment-ui table组件 -- 远程筛选排序提到过缓存,但是有所取巧,这次重新 ...
- doT学习(三)之实战
案例一: <html> <head> <script id="headertmpl" type="text/x-dot-template&q ...
- ros基础知识总结
参考于:ros官网教程 实验楼:ros机器人操作系统自主学习实验 基础知识 1 一个catkin程序包由什么组成? 一个程序包要想称为catkin程序包必须符合以下要求: 该程序包必须包含catkin ...