洛谷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. js对象属性名和属性值生成新数组时都作为属性值

    const obj = { id:1, name:'zhangsan', age:18 } const arr = []; Object.getOwnPropertyNames(obj).forEac ...

  2. Thread--lock,lockInterruptibly,tryLock,tryLock(long timeout, TimeUnit unit)

    参考:http://www.dewen.net.cn/q/9077 http://coolxing.iteye.com/blog/1236909 lock,tryLock,lockInterrupti ...

  3. Lambder笔记

    记录Lambda语法(λ ,匿名函数)以及三个Python常见内置函数 形如:y=f(x)=x*x 使用lambda语法将对一个变量的运算抽象出来,如同f(),或是数学中的函数.关系.映射 f = l ...

  4. LA 6621 /ZOJ 3736 Pocket Cube 打表+暴力

    这道题是长沙区域赛的一道简单题,当时题目在ZOJ重现的时候就做了一次,但是做的好复杂,用的BFS暴力,而且还没打表,最后还是莫名其妙的爆栈错误,所以就一直没弄出来,昨天做到大白书上例题05年东京区域赛 ...

  5. Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore , Condition

    http://www.importnew.com/21889.html 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDown ...

  6. poj2778 矩阵乘法+ac自动机

    题:http://poj.org/problem?id=2778 题意:给定m个模式串,问长度为n的字符串不包含这些模式串的有几种可能 分析:因为n很大,所以考虑矩阵ksm来解决,构造一个矩阵res[ ...

  7. python学习笔记--数据类型和变量总结

    1.数据类型 字符串 数字 列表 元祖 字典 2.可变不可变划分 可变:列表,字典 不可变:字符串,数字,元祖 举例:字符串,通过id查看字符串变量在内存中的地址.两次存的值不一样,这就说明了内存重新 ...

  8. 【C#并发】00概述

    摘自<C#并发编程经典实例>[美]Stephen Cleary 并发:同时做多件事情.终端用户利用并发功能,在输入数据库的同时相应用户输入.服务器应用并发,在处理第一个请求的同时响应第二个 ...

  9. sql字符串常用函数

    1.replace  REPLACE(String,from_str,to_str) 即:将String中所有出现的from_str替换为to_str 2.left  left(String,2) 从 ...

  10. 上传本地项目到GIT码云

    1.下载GIT 下载地址:https://git-scm.com/downloads 我这里下载的64位 2.安装GIT 双击下载的Git-2.18.0-64-bit.exe文件,选择自己的安装目录, ...