洛谷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通俗易懂题的更多相关文章

  1. UOJ #146. 【NOIP2015】信息传递 连通分量 tarjan模板题

    http://uoj.ac/problem/146 题解:强连通分量 tarjan模板题.同时试了一下codeblock #include<bits/stdc++.h> using nam ...

  2. POJ 2186:Popular Cows Tarjan模板题

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25945   Accepted: 10612 De ...

  3. Tarjan 做题总结

    这两天Tarjan复习完后把题做了做.洛谷题单<图的连通性>已经做得差不多了.大部分是Tarjan的题,所以写一篇小总结. T1 [模板] 缩点 不多bb.我已经写过关于Tarjan模板的 ...

  4. PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)

    1008. Airline Routes (35) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue Given a ...

  5. 有向图强连通分支的Tarjan算法讲解 + HDU 1269 连通图 Tarjan 结题报告

    题目很简单就拿着这道题简单说说 有向图强连通分支的Tarjan算法 有向图强连通分支的Tarjan算法伪代码如下:void Tarjan(u) {dfn[u]=low[u]=++index//进行DF ...

  6. Tarjan模板题——牛的舞会

    题目描述 约翰的N (2 <= N <= 10,000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别 上鲜花,她们要表演圆舞. 只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一 ...

  7. Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]

    题目 大意: 缩点后转为求最长链的长度和最长链的个数 思路: 看懂题就会做系列 长度和个数都可以拓扑排序后DP求得 毕竟是2007年的题 代码: 如下 #include <cstdio> ...

  8. Tarjan水题系列(4):HAOI2010 软件安装

    题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi​的磁盘空间,它的价值为Vi​.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi​的和最大). ...

  9. Tarjan水题系列(3):HNOI2006 潘多拉的魔盒

    题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...

随机推荐

  1. Idea Spring工程不识别注解

    如图所示 Idea工具报出很多注解不识别,开始怀疑是 工具问题,重装Idea.配置lombak都不行,切换分支发现正常,一定是合入代码修改啥了,一行行比对,果然是这行 import org.sprin ...

  2. Django模型基础——(二)

    上篇博客主要讲了django中对数据库的增删改查,下面深入再讲解下对数据库的操作. 常用的查询方法 下面以表名为User为例 User.object.first() :返回表中第一条数据 User.o ...

  3. Python说文解字_计数器

    from collections import Counter response = [ "vanilla", "chocolate", "vanil ...

  4. $_SESSION $_COOKIE

    $_SESSION是临时会话变量,用来储存访问者信息.内容是储存在服务器上面的.比如 $_SESSION["ABC"] = "aaa";那么这个用户访问时,$_ ...

  5. UVA 10269 Super Mario,最短路+动态规划

    这个题目我昨晚看到的,没什么思路,因为马里奥有boot加速器,只要中间没有城堡,即可不耗时间和脚力,瞬间移动不超过L距离,遇见城堡就要停下来,当然不能该使用超过K次...我纠结了很久,最终觉得还是只能 ...

  6. 题解 P2016 【战略游戏】

    题目 解法跟 dalao @real_ljs 类似,但没有用到递归 [分析] 题目相当于需要求覆盖这颗树需要的最小点数 用 \(Dp_{i,0/1}\) 表示在这棵树中,以 \(i\) 为根节点的子树 ...

  7. 干货 | 云解析DNS之网站监控

    云解析是在域名解析的基础上,由京东云团队,结合京东云的优质网络.主机资源研发的高可用.高可靠.功能丰富的权威DNS服务器.云解析拥有简单易用的控制台,方便用户对域名进行操作.采用多集群.多节点部署,拥 ...

  8. 01 语言基础+高级:1-8 File类与IO流_day10【缓冲流、转换流、序列化流】

    day10[缓冲流.转换流.序列化流] 主要内容 缓冲流 转换流 序列化流 打印流 教学目标 能够使用字节缓冲流读取数据到程序 能够使用字节缓冲流写出数据到文件 能够明确字符缓冲流的作用和基本用法 能 ...

  9. protobuf编译工具使用

    1.下载,配置环境变量 下载地址:https://github.com/google/protobuf/releases,选择protoc-xxx-win64.zip下载 把.exe文件的位置加入到P ...

  10. 【转载】解决Cannot download "https://github.com/sass/node-sass/releases/download...问题

    因很早做了一个小demo,并且在其他成熟的电脑上(node配置好的)下载依赖包没什么问题,最近就在新的电脑上配置好所有东西后,去下载这个demo的依赖包,就出现了node-sass无法正常解析的问题, ...