CodeForces 1213F (强联通分量分解+拓扑排序)
•题意
给你两个数组 p,q ,分别存放 1~n 的某个全排列;
让你根据这两个数组构造一个字符串 S,要求:
(1)$\forall i \in [1,n-1],S_{pi}\leq S _{pi+1} ,\forall i \in [1,n-1],S_{qi} \leq S _{qi+1}$
(2)字符串 S 至少包含 k 个不同的小写字母;
•思路
类似于牛客第五场的H
不过由于这个不知道字母是什么,需要利用强联通分解,
把属于同一个强联通块的位置置于同一个字母,
然后根据前后关系建图连边
•代码
- #include<bits/stdc++.h>
- using namespace std;
- #define mem(a,b) memset(a,b,sizeof a)
- const int maxn=2e5+;
- int n,m;
- int a[maxn];
- struct Edge
- {
- int to,next;
- }G[maxn*];
- int head[maxn],cnt;
- void addEdge(int u,int v)
- {
- G[++cnt].to=v;
- G[cnt].next=head[u];
- head[u]=cnt;
- }
- int col[maxn];
- struct SCC///强联通分量分解
- {
- bool vis[maxn];
- vector<int> vs;
- void DFS(int u)
- {
- vis[u]=true;
- for(int i=head[u];i;i=G[i].next)
- {
- int v=G[i].to;
- if(!(i&)||vis[v])
- continue;
- DFS(v);
- }
- vs.push_back(u);
- }
- void REDFS(int u,int k)
- {
- vis[u]=true;
- col[u]=k;
- for(int i=head[u];i;i=G[i].next)
- {
- int v=G[i].to;
- if((i&)||vis[v])
- continue;
- REDFS(v,k);
- }
- }
- int scc()
- {
- vs.clear();
- mem(vis,false);
- for(int i=;i<=n;i++)
- if(!vis[i])
- DFS(i);
- mem(vis,false);
- int k=;
- for(int i=vs.size()-;i>=;i--)
- if(!vis[vs[i]])
- REDFS(vs[i],++k);
- return k;
- }
- }_scc;
- Edge newG[maxn*];
- int head2[maxn];
- void addnew(int u,int v)
- {
- newG[++cnt].to=v;
- newG[cnt].next=head2[u];
- head2[u]=cnt;
- }
- int Indu[maxn];
- char ch[maxn];
- queue<int >q;
- void topsort(int k)///拓扑排序
- {
- while(!q.empty())
- q.pop();
- for(int i=;i<=k;i++)
- if(!Indu[i])
- q.push(i);
- int now=;
- while(!q.empty())
- {
- int u=q.front();
- ch[u]='a'+now;
- ///>=m个不同字母,那就正好m个,后面的都置为同一个
- if(now<m-)
- now++;
- q.pop();
- for(int i=head2[u];i;i=newG[i].next)
- {
- int v=newG[i].to;
- Indu[v]--;
- if(!Indu[v])
- q.push(v);
- }
- }
- }
- int main()
- {
- cin>>n>>m;
- for(int i=;i<=;i++)
- {
- for(int j=;j<=n;j++)
- cin>>a[j];
- for(int j=;j<=n-;j++)
- {
- addEdge(a[j],a[j+]);
- addEdge(a[j+],a[j]);
- }
- }
- int k=_scc.scc();
- if(k<m)
- puts("NO");
- else
- {
- puts("YES");
- cnt=;
- ///缩点,把每一个联通快看做一个点
- ///利用点col[i]之间的关系建图,跑拓扑序
- for(int u=;u<=n;u++)
- {
- for(int i=head[u];i;i=G[i].next)
- {
- int v=G[i].to;
- if(!(i&)||col[u]==col[v])
- continue;
- addnew(col[u],col[v]);
- Indu[col[v]]++;
- }
- }
- topsort(k);
- for(int i=;i<=n;i++)
- cout<<ch[col[i]];
- }
- }
CodeForces 1213F (强联通分量分解+拓扑排序)的更多相关文章
- POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)
[题意]: 有N个房间,M条有向边,问能否毫无顾虑的随机选两个点x, y,使从①x到达y,或者,②从y到达x,一定至少有一条成立.注意是或者,不是且. [思路]: 先考虑,x->y或者y-> ...
- HDU 6170 FFF at Valentine(强联通缩点+拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165 题意:给你一个无环,无重边的有向图,问你任意两点,是否存在路径使得其中一点能到达另一点 解析:强 ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点
题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...
- POJ 2186 Popular Cows(强联通分量)
题目链接:http://poj.org/problem?id=2186 题目大意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...
- POJ 2186 Popular cows(Kosaraju+强联通分量模板)
题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为 ...
- POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)
题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...
- 强联通分量之kosaraju算法
首先定义:强联通分量是有向图G=(V, E)的最大结点集合,满足该集合中的任意一对结点v和u,路径vu和uv同时存在. kosaraju算法用来寻找强联通分量.对于图G,它首先随便找个结点dfs,求出 ...
- 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)
Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...
随机推荐
- 阿里云OSS同城冗余存储正式商业化,提供云上同城容灾能力
近日,阿里云正式发布OSS同城冗余存储产品.这是国内目前提供同城多AZ冗余部署能力覆盖最广的云上对象存储产品,可以实现云存储的同城双活,满足企业级客户对于“发生机房级灾难事件时数据不丢失,业务不中断” ...
- bzoj4152 The Captain
Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2 ...
- 在dva框架和create-react-app创建出来的框架中修饰器语法与按需加载引入antd分别配置
按需加载需要的包 babel-plugin-import 装饰器语法需要的包 @babel/plugin-proposal-decorators dva框架 将.webpackrc 改成. ...
- kubernetes1.3:操作Docker
Kubernetes对Docker的管理是通过一个第三方组件实现的.在Kubernetes1.2中这个第三方组件就是go-dockerclient,这是一个GO语言写的docker客户端,支持Dock ...
- 在沙箱中IE不能上网的解决方法
近期在解决一个问题,在我们的沙箱中IE不能上网 现象: IE不能上网.输入www.baidu.com 提示:不能查找到DNS.也不能ping 通 其它浏览器上网没有问题(SG浏览器,C ...
- 2018-7-5-dotnet-设计规范-·-抽象定义
title author date CreateTime categories dotnet 设计规范 · 抽象定义 lindexi 2018-07-05 15:48:20 +0800 2018-2- ...
- C++中用stringstream类进行数据类型的转换
我们在进行C++编程过程中,经常需要进行数据类型的转换. stringstream 类的作用就是进行数据类型转换.要想在程序中使用 stringstream 类,我们需要在源程序文件中包含头文件inc ...
- @topcoder - 2017TCOAlgorithmRound2A - D1L2@ DistanceZeroAndOne
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个 n 个点的无向简单的连通图,编号从 0 到 n-1. 现给 ...
- 设计模式 - 工厂模式(factory pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...
- @游记@ CQOI2019(十二省联考)
目录 @day - 0@ @day - 1@ @day - 2@ @后记@ 我只是来打酱油哒-- 顶多能进个 E 类继续打酱油. 原本还在互奶 A 队,结果现在--铁定进不了队啦. 对初中生的歧视啊 ...