cf949C
题意简述:有n个点,每一个点都有一个权值,然后有m个条件,每一个条件是a[x]!=a[y],让选择最少的点且至少选择1个,然后让这个点的权值+1,使得条件仍满足
所有数对k取模
题解:如果a[x]+1=a[y]那么x向y连边,a[y]+1=a[x]那么y向x连边,此时答案等于缩点之后出度为0的分量中点最少的一个
#include<bits/stdc++.h>
#define forn(i, n) for (int i = 0 ; i < int(n) ; i++)
#define fore(i, s, t) for (int i = s ; i < (int)t ; i++)
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define pf2(x,y) printf("%d %d\n",x,y)
#define pf(x) printf("%d\n",x)
#define each(x) for(auto it:x) cout<<it<<endl;
#define pi pair<int,int>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int maxm=2e5+5;
const int inf=1e9;
int head[maxn],ver[maxm],nex[maxm],tot;
void inline AddEdge(int x,int y){
ver[++tot]=y,nex[tot]=head[x],head[x]=tot;
}
int dfn[maxn],low[maxn],num,sccnum,scc[maxn],s[maxn],d[maxn],cnt[maxn],top;
void Tarjan(int x){
low[x]=dfn[x]=++num;
s[++top]=x;
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(!dfn[y]) {
Tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(!scc[y]) low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
sccnum++;
while(s[top]!=x){
scc[s[top]]=sccnum;
top--;
cnt[sccnum]++;
}
cnt[sccnum]++;
scc[s[top]]=sccnum;
top--;
}
}
int n,m,k,a[maxn];
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
if((a[x]+1)%k==a[y]) AddEdge(x,y);
if((a[y]+1)%k==a[x]) AddEdge(y,x);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) Tarjan(i);
for(int x=1;x<=n;x++)
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(scc[x]!=scc[y]) {
d[scc[x]]++;
}
}
int idx=0;
cnt[idx]=1e9;
for(int i=1;i<=n;i++){
if(d[scc[i]]==0 && cnt[scc[i]]<cnt[scc[idx]])
idx=i;
}
cout<<cnt[scc[idx]]<<endl;
for(int i=1;i<=n;i++)
if(scc[idx]==scc[i]) cout<<i<<' ';
cout<<endl;
return 0;
}
cf949C的更多相关文章
- cf949C 建模,SCC缩点
/* 给定n个数据中心,m份资料,每份资料在其中的两个中心备份,一天可供下载的时间是h小时 中心i在第hi小时需要维护,无法下载 现在要将一些中心的维护时间往后推1小时,使得任意时刻每份资料都可以被下 ...
- [CF949C]Data Center Maintenance
题目大意:$n$个点,每个点有一个值$w_i$.$m$个条件,每个条件给出$x,y$,要求$w_x\not =w_y$.选择最少的点,使其值加$1$后,所有条件成立(数据保证有解). 题解:对于每个条 ...
- CF949C Data Center Maintenance(建图+强联通分量)
题意 有 n 个信息中心,第 i 个信息中心要在第 ti 个小时维护,维护期间信息不能被获得. 每个用户的数据都有两份备份,第 i 个用户的数据放在信息中心 c(i,1) 和 c(i,2). 现在要挑 ...
随机推荐
- config 模块
import configparser #配置文件 config = configparser.ConfigParser()config["DEFAULT"] = {'Server ...
- artTemplate--模板使用自定义函数(2)
我的常用自定义函数 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> < ...
- sockaddr与sockaddr_in的关系
WIN7+VS2013 sockaddr // // Structure used to store most addresses. // typedef struct sockaddr { #if ...
- 小程序图片 mode 设置为 widthFix 图片显示瞬间竖向拉伸变形闪烁
官方文档中 mode="widthFix" 宽度不变,高度自动变化,保持原图宽高比不变,即设置图片宽度而高度自适应. 但是在实际开发中发现图片在初始加载时瞬间竖向拉伸变形闪烁然 ...
- HotSpot虚拟机对象创建
2.3.1对象创建 Java是一门面向对象的语言,在Java程序的运行过程中无时无刻都有新的对象被创建出来.从语言的层面看,创建对象通常仅仅是一个new关键字而已,从虚拟机的角度看,创建对象又是怎样的 ...
- Codeforces_805
A.当l == r时,肯定输出这个数就可以了,当存在两个或两个以上连续的数时,2肯定是最多的数,或最多的数之一. #include<bits/stdc++.h> using namespa ...
- ARTS Week 2
Nov 4,2019 ~ Nov 10,2019 Algorithm 本周主要的算法是如何求两个数的最大公因数.传统的想法便是对这两个数分解质因数,而后找到其公共因数,再相乘,这样就会得到最大公因数了 ...
- 二狗子 、初恋及HTTPS
最近二狗子宅在老家,最悠闲的就是泡壶茶看着院子的风景发呆一下午.今天,二狗子看到了对面自己暗恋的小翠花,看着美好的小翠花二狗子不禁想起了自己美好的初恋. 二狗子的初恋在初中,那个时候学校禁止带手机.上 ...
- Sklearn——SVC学习笔记(图像分割)
新年第二更. 很长时间前就想总结一下用SVC来做图像分割的方法了,方法实现了,但是一直没有总结,今天再来回顾一遍. 首先介绍一下.今天要总结的图像分割其实属于像素级分类,其输出是把图像按照不同的类别逐 ...
- MySQL性能优化---索引
一.什么是索引 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里 ...