题意 : 给出 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 ( 思维 && 强连通分量缩点 )的更多相关文章

  1. Codeforces 950E Data Center Maintenance 强连通分量

    题目链接 题意 有\(n\)个信息中心,每个信息中心都有自己的维护时间\((0\leq t\lt h)\),在这个时刻里面的信息不能被获得. 每个用户的数据都有两份备份,放在两个相异的信息中心(维护时 ...

  2. codeforces 949C - Data Center Maintenance【tarjan】

    首先转换图论模型,把某个客户一个终端的维修时间(+1)%h之后和另一个终端维修时间一样,这样的两个终端连一条有向边,表示推后一个终端就必须推后另一个 然后tarjan缩点,一个scc里的终端是要一起推 ...

  3. Codeforces 949C(Data Center Maintenance,Tarjan缩点)

    难度系数:1900 graphs 题意:有 n 个银行,m 个客户,每个客户都把自己的资料放在 2 个银行,一天总共有 h 小时,每个银行每天都要维护一小时,这一小时内银行无法工作,但是这一小时客户仍 ...

  4. Codeforces 950.E Data Center Maintenance

    E. Data Center Maintenance time limit per test 1 second memory limit per test 512 megabytes input st ...

  5. POJ1236Network of Schools[强连通分量|缩点]

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16571   Accepted: 65 ...

  6. POJ1236Network of Schools(强连通分量 + 缩点)

    题目链接Network of Schools 参考斌神博客 强连通分量缩点求入度为0的个数和出度为0的分量个数 题目大意:N(2<N<100)各学校之间有单向的网络,每个学校得到一套软件后 ...

  7. HD2767Proving Equivalences(有向图强连通分量+缩点)

    题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...

  8. UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)

    题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...

  9. ZOJ3795 Grouping(强连通分量+缩点+记忆化搜索)

    题目给一张有向图,要把点分组,问最少要几个组使得同组内的任意两点不连通. 首先考虑找出强连通分量缩点后形成DAG,强连通分量内的点肯定各自一组,两个强连通分量的拓扑序能确定的也得各自一组. 能在同一组 ...

随机推荐

  1. 【miscellaneous】星光级超低照度摄像机技术分析

    低照度摄像机采用了超灵敏度图像传感器和独有的电子倍增和噪点控制技术能够极大地提高摄像机的灵敏度,并且具备24小时全彩色实时效果,绝无普通低照度摄像机出现的拖尾现象,以满足对夜间高品质监控的需求.    ...

  2. mysql——多表——子查询——示例

    子查询: 子查询是将一个查询语句嵌套在另外一个查询语句中,内层查询语句的查询结果,可以作为外来层查询语句提供查询条件. 因此在特定条件下,一个查询语句的条件,需要另外一个查询语句来获取. 前期准备表: ...

  3. mysql查看锁查看

    关键词:mysql锁争用,mysql锁查看 --------------------- 作者:边城cn 来源:CSDN 原文:https://blog.csdn.net/miyatang/articl ...

  4. pandas中数据结构-Series

    pandas中数据结构-Series pandas简介 Pandas是一个开源的,BSD许可的Python库,为Python编程语言提供了高性能,易于使用的数据结构和数据分析工具.Python与Pan ...

  5. 使用批处理选择运行控制台程序(简易cui)

    批处理可以用于启动一些控制台程序.昨天在github上找到一个有意思的项目OpenRA : 一个开源的红警游戏. 发现该游戏的启动程序(launch-game)是用批处理写的 就学习了下 *没有玩过批 ...

  6. jmeter---linux安装运行

    安装jdk 安装jmeter 配置环境变量: export JAVA_HOME=/usr/java/1.8.0_181 export CLASSPATH=.:JAVA_HOME/lib/dt.jar: ...

  7. Fliter设置字符编码,解决中文问题

    class EncodingFilter implements FileFilter{ private String encoding; @Override public boolean accept ...

  8. vue-awesome-swiper轮播插件

    1. github上搜索vue-awesome-swiper 2. readme中有安装方法,建议在插件名后@版本号,使用稳定的老版本 npm install vue-awesome-swiper@x ...

  9. jQuery中outerWidth()方法

    截图自:菜鸟教程https://www.runoob.com/jquery/html-outerwidth.html

  10. Linux操作系统笔记

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> //linux下面的头文件 #include ...