洛谷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. mysql插入文本文档及读取

    1.把本地的一个文件插入到数据库中,数据库字段用text保存 public static void main(String[] args) { PropKit.use(“pro.txt”);Druid ...

  2. 移动端H5开发遇到的问题及解决方法

    本篇文章给大家带来的内容是关于移动端H5开发遇到的问题及解决方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 微信分享签名错误invalid signature vue单页应用hi ...

  3. WinServer--mstsc

    部署项目时,远程连接服务器一直提示连接达最大拒绝连接. mstsc /admin 从sp2后,/console参数就改为/admin了,其实就是登陆到远程服务器的控制台,一般加这个参数是为了在远程桌面 ...

  4. App的工程框架

    对于我刚下载的Android studio,来说一说它的框架结构  Project项目结构: .gradle:Gradle编译系统,版本由wrapper指定 .idea:IDE所需要的文件 .app: ...

  5. Codeforces Round #571 (Unrated for Div. 1+Div. 2)

    A 略 B 被删了,被这个假题搞自闭了,显然没做出来. C 开始莽了个NTT,后来发现会TLE,其实是个SB前缀和,对于这题,我无**说. #include<bits/stdc++.h> ...

  6. 深度学习在美团配送ETA预估中的探索与实践

    1.背景 ETA(Estimated Time of Arrival,“预计送达时间”),即用户下单后,配送人员在多长时间内将外卖送达到用户手中.送达时间预测的结果,将会以”预计送达时间”的形式,展现 ...

  7. maven项目出现Xxx is not a Servlet的问题

    应该是tomcat的jar包和maven的jar包冲突 在pom.xml中找到 <dependency> <groupId>org.apache.tomcat</grou ...

  8. 用数组来实现Stack

    1:Stack特点 stack:栈,是一种特殊的数据结构,有着先入后出的特点(first in last out).stack中栈底始终不变,只有一端能变化.栈顶在有数据push的时候增大,有数据po ...

  9. BeanFactory和ApplicationContext的区别(Bean工厂和应用上下文)

    https://blog.csdn.net/qq_20757489/article/details/88543252 https://blog.csdn.net/pythias_/article/de ...

  10. ElasticSearch-The number of object passed must be even but was [1]-问题解决

    ES版本:6.4.3 1.The number of object passed must be even but was [1] 问题代码: IndexRequest indexRequest = ...