tarjan求强连通+缩点——cf1248E
这题好像是DEF里最水的,,
/*
建图:如果a认识b,那么从a->b连一条边,将点分成两个集合A,B,没有从A->B的边
求出强连通分量,再造一张新图,新图中任取一个的出度为0的点作为集合A即可
*/
#include<bits/stdc++.h>
using namespace std;
#define N 2000005 struct Edge{int to,nxt;}e[N<<];
int head[N],tot,n,m; int c[N],out[N],cnt;//新图的点个数,每个点的出度
int ind,dfn[N],low[N],stk[N],top,ins[N];
void tarjan(int x){
dfn[x]=low[x]=++ind;
stk[++top]=x;ins[x]=;
for(int i=head[x];i!=-;i=e[i].nxt){
int y=e[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])
low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
cnt++;
int y;
do{
y=stk[top--];
ins[y]=;
c[y]=cnt;
}while(x!=y);
}
} void init(){
cnt=tot=ind=;
for(int i=;i<=*n;i++)
low[i]=dfn[i]=ins[i]=out[i]=c[i]=,head[i]=-;
}
void add(int u,int v){
e[tot].to=v;e[tot].nxt=head[u];head[u]=tot++;
} int main(){
int t;cin>>t;while(t--){
cin>>n>>m;
init();
for(int i=;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
if(u!=v)add(u,v);
} for(int i=;i<=n;i++)
if(!dfn[i])tarjan(i); for(int u=;u<=n;u++)
for(int i=head[u];i!=-;i=e[i].nxt){
int v=e[i].to;
if(c[u]!=c[v])
out[c[u]]++;
} int ans=;
for(int i=;i<=cnt;i++)
if(out[i]==){ans=i;break;}
if(ans==||cnt==){puts("No");continue;} puts("Yes");
int cnta=,cntb=;
for(int i=;i<=n;i++)
if(c[i]==ans)cnta++;
else cntb++;
cout<<cnta<<" "<<cntb<<'\n';
for(int i=;i<=n;i++)if(c[i]==ans)cout<<i<<" ";puts("");
for(int i=;i<=n;i++)if(c[i]!=ans)cout<<i<<" ";puts("");
}
}
/*
9 21
1 7
5 7
4 8
1 1
4 4
7 3
3 3
6 3
6 6
5 5
7 7
8 2
9 2
3 1
8 8
9 9
2 2
1 5
6 7
2 6
6 4 */
tarjan求强连通+缩点——cf1248E的更多相关文章
- tarjan求强连通分量+缩点+割点以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明
“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄> 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...
- HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题
Summer Holiday Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- CCF 高速公路 tarjan求强连通分量
问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...
- UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】
Road Networks Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Stat ...
- tarjan求强连通分量(模板)
https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...
- Tarjan求强连通分量、求桥和割点模板
Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...
随机推荐
- Spring整合SpringDataJpa配置文件头
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- vs code常用插件(python)
1.chinese 作用:vscode设置为中文. 使用方法:Ctrl+Shift+P:输入 "config":选择zh 2.python 作用:调试 3.autoDocstrin ...
- delphi 随意将函数执行权限提高到Ring0源代码
//随意将函数执行权限提高到Ring0源代码//Windows 2K以上的操作系统,//用途: 提供超级简单使用的APIrocessRing0(),//可将delphi中的任意函数由原來的Ring3权 ...
- 【开源项目】一篇文章搞掂:Pig微服务框架
1.项目开发环境和运行步骤 1.1.项目开发环境 Idea:2018.1.6 Maven:3.5.3 JDK:1.8.0_172 MySQL:5.7.19(之前安装8.0.11会运行失败) Redis ...
- 基于Tomcat如何显示服务器上的图片或文件?
修改tomcat中conf文件夹下的server.xml文件,在 <Valve className="org.apache.catalina.valves.AccessLogValve ...
- appium 链接真机
1. 安装驱动 说明:如果驱动装不上,可以使用第三方的工具去安装.(一般来说还是用第三方) 这里推荐锤子科技的HandShaker, 地址:http://www.smartisan.com/apps/ ...
- ubuntu php多版本共存切换
做开发时,由于本机开发的php版本跟线上发布的php版本不一致,很容易在上线后,发现因版本的影响导致一些bug,但又不想重新去换本机的php版本,那么多版本共存就很方便了!有必要时,切换到指定版本测试 ...
- upc组队赛7 Star in Parentheses
Star in Parentheses 题目描述 You are given a string S, which is balanced parentheses with a star symbol ...
- shell 从函数文件中调用函数的方法
你可以把所有的函数存储在一个函数文件中 你可以把所有的文件函数加载到当前脚本或命令行 加载函数文件中所有函数的方法: source xxx.sh
- windows配置环境变量
windows配置环境变量 1.第一步 2.第二步 3.第三步