tarjan通俗易懂题
洛谷2661
https://www.luogu.org/problemnew/show/P2661
分析:求缩点后成环中,环大小最小的size
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+;
vector<int>e[M];
int vis[M],dfn[M],low[M],cnt,ans=M;
stack<int>S;
void tarjan(int u){
dfn[u]=low[u]=++cnt;
vis[u]=;
S.push(u);
for(int i=;i<e[u].size();i++){
int v=e[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int countt=;
while(true){
int t=S.top();
S.pop();
vis[t]=;
countt++;
if(t==u)
break;
}
if(countt>)
ans=min(ans,countt);
}
}
int main(){ int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;
scanf("%d",&x);
e[i].push_back(x);
}
for(int i=;i<=n;i++){
if(!dfn[i])
tarjan(i);
}
cout<<ans;
return ;
}
https://www.luogu.org/problemnew/show/P1726
分析:还是求环的大小,不过要在存路径时加些操作
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
#include<vector>
using namespace std;
const int M=5e4+;
int dfn[M],low[M],vis[M],a[M],b[M],cnt;
vector<int>e[M];
stack<int>S;
int ans;
void tarjan(int u){
dfn[u]=low[u]=++cnt;
vis[u]=;
S.push(u);
for(int i=;i<e[u].size();i++){
int v=e[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int countt=;
while(true){
int t=S.top();
S.pop();
vis[t]=;
a[countt++]=t;
if(t==u)
break;
}
if(ans<=countt){
sort(a,a+countt);
if(ans==countt){
int flag=;
for(int i=;i<countt;i++)
if(a[i]<b[i]){
flag=;
break;
}
else if(a[i]>b[i])
break;
if(flag==)
for(int i=;i<countt;i++)
b[i]=a[i];
}
else{
for(int i=;i<countt;i++)
b[i]=a[i];
}
ans=countt;
}
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int u,v,t;
scanf("%d%d%d",&u,&v,&t);
if(t==)
e[u].push_back(v);
else
e[u].push_back(v),e[v].push_back(u); }
for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
printf("%d\n",ans);
for(int i=;i<ans;i++){
printf("%d ",b[i]);
}
return ;
}
https://www.luogu.org/problemnew/show/P2341
分析:所求量一定为经缩点后唯一出度为0的强联通分量的大小
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<vector>
using namespace std;
const int M=1e4+;
const int N=5e4+;
vector<int>e[M]; int out[M],in[M],dfn[M],low[M],vis[M],sz[N],cnt,tot,cmp[N];
stack<int>S;
void tarjan(int u){
low[u]=dfn[u]=++cnt;
vis[u]=;
S.push(u);
for(int i=;i<e[u].size();i++){
int v=e[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])
low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int countt=;
tot++;
while(true){
int t=S.top();
S.pop();
vis[t]=;
cmp[t]=tot;
countt++;
if(t==u)
break;
}
sz[tot]=countt;
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
int u,v;
for(int i=;i<=m;i++){ scanf("%d%d",&u,&v);
e[u].push_back(v);
} for(int i=;i<=n;i++)
if(!dfn[i])
tarjan(i);
int sum=;
for(int i=;i<=n;i++)
for(int j=;j<e[i].size();j++){
int v=e[i][j];
if(cmp[i]!=cmp[v])
out[cmp[i]]++,in[cmp[v]]++;
}
int countt=,sign;
for(int i=;i<=tot;i++)
if(out[i]==)
countt++,sign=i;
if(countt>)
return puts(""),;
printf("%d\n",sz[sign]); return ;
}
tarjan通俗易懂题的更多相关文章
- UOJ #146. 【NOIP2015】信息传递 连通分量 tarjan模板题
http://uoj.ac/problem/146 题解:强连通分量 tarjan模板题.同时试了一下codeblock #include<bits/stdc++.h> using nam ...
- POJ 2186:Popular Cows Tarjan模板题
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25945 Accepted: 10612 De ...
- Tarjan 做题总结
这两天Tarjan复习完后把题做了做.洛谷题单<图的连通性>已经做得差不多了.大部分是Tarjan的题,所以写一篇小总结. T1 [模板] 缩点 不多bb.我已经写过关于Tarjan模板的 ...
- PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)
1008. Airline Routes (35) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue Given a ...
- 有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告
题目很简单就拿着这道题简单说说 有向图强连通分支的Tarjan算法 有向图强连通分支的Tarjan算法伪代码如下:void Tarjan(u) {dfn[u]=low[u]=++index//进行DF ...
- Tarjan模板题——牛的舞会
题目描述 约翰的N (2 <= N <= 10,000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别 上鲜花,她们要表演圆舞. 只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一 ...
- Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]
题目 大意: 缩点后转为求最长链的长度和最长链的个数 思路: 看懂题就会做系列 长度和个数都可以拓扑排序后DP求得 毕竟是2007年的题 代码: 如下 #include <cstdio> ...
- Tarjan水题系列(4):HAOI2010 软件安装
题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). ...
- Tarjan水题系列(3):HNOI2006 潘多拉的魔盒
题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...
随机推荐
- ZOJ- 2562 反素数使用
借用了下东北师大ACM的反素数模版. 本来我是在刷线段树的,有一题碰到了反素数,所以学了一下..有反素数的存在,使得一个x ,使得x的约数个数,在1 到 x的所有数里面,是最大的. 这里面还涉及安叔那 ...
- 吴裕雄--天生自然TensorFlow2教程:前向传播(张量)- 实战
手写数字识别流程 MNIST手写数字集7000*10张图片 60k张图片训练,10k张图片测试 每张图片是28*28,如果是彩色图片是28*28*3-255表示图片的灰度值,0表示纯白,255表示纯黑 ...
- 面试准备 css 书写顺序及原理
书写顺序 (1)定位属性:position display float left top right bottom overflow clear z-index (2)自身属性: ...
- 【WPF学习】第三十七章 触发器
WPF中有个主题,就是以声明方式扩展代码的功能.当使用样式.资源或数据绑定时,将发现即使不使用代码,也能完成不少工作. 触发器是另一个实现这种功能的例子.使用触发器,可自动完成简单的样式改变,而这通常 ...
- 用Pandas Dataframe来抓取重构金融股票的各种业务&数据形态
4. 如果计算各项股票指标时,或者处理业务流程时,上一篇的直观认知数据结构,怎样帮助开发者去好好操作,又同时避免计算错误的坑. 首先从上篇的数据结据,可以看出/设计出多少种业务和股票指标. A. 恒生 ...
- mybatis框架快速入门
通过快速入门示例,我们发现使用mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis要求编写两个配置文件,就可以实现功能.远比我们之前的jdbc方便多了.(我们使用 ...
- 纯css隔行显示不同颜色
通过:nth-child(even) 属性来设置背景色可以使table表格偶数行显示不同颜色::nth-child(odd)设置背景色可以使table表格奇数行显示不同颜色:
- 常见的nosql数据库有哪些?以及他们的特点与区别?
一.常见的nosql 二.Redis,Memcache,MongoDb的特点 (1).Redis 优点: 1.支持多种数据结构,如 string(字符串). list(双向链表).dict(hash表 ...
- java客房管理小项目,适合java小白练手的项目!
java客房管理小项目 这个客房管理小项目,适合java初学者练手.功能虽然不多,但是内容很齐全! 喜欢这样文章的可以关注我,我会持续更新,你们的关注是我更新的动力!需要更多java学习资料的也可以私 ...
- Cover letter
Cover letter意义和新意可以写的夸张一点没关系,写因存在竞争关系的不建议作为审稿人.不要推荐熟悉人(导师,导师的导师,有关系的人,co-authors)作为推荐审稿人,不要推荐非该领域内大牛 ...