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求得 在此不赘述 此题 ...
随机推荐
- 查看docker的挂载目录
docker inspect container_name | grep Mounts -A 20docker inspect container_id | grep Mounts -A 20
- 吴裕雄--天生自然 JAVASCRIPT开发学习:测试 jQuery
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Python—程序设计:单例模式
单例模式 单例模式(Singleton Pattern)属于创建型模式,它提供了一种创建对象的最佳方式.这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,并提供一种访问其 ...
- awk grep sed 的一些问题
条件 匹配 打印含关键字的行 ps aux | sort -k 4 -r | awk '$4 ~ /^[0-9]/ && $4>0 {print $4,$11}' z ...
- Idea 我的快捷键
new对象的快捷键:ctrl+alt+空格 ctrl+alt+空格提示,再加上ctrl+shift+enter 格式化这一行 快捷键自动生成变量名和类型ctrl + alt + v Ctrl+Alt+ ...
- os发展史
01. 操作系统的发展历史 1.1 Unix 1965 年之前的时候,电脑并不像现在一样普遍,它可不是一般人能碰的起的,除非是军事或者学院的研究机构,而且当时大型主机至多能提供30台终端(30个键盘. ...
- share团队冲刺7
团队冲刺第七天 昨天:加入activity的内容,和队友的代码进行整合实现部分按钮功能 今天:继续完善代码,完善其他页面的功能,对主页和发表页面进行开发 问题:无
- UML-领域模型-定义
领域模型是OO分析中最重要和经典的模型(用例是重要的需求分析制品,但不是面向对象的).领域模型也是重点. 1.关系 2.例子 3.定义 领域模型没有定义方法的类图.只包括: 1).领域对象或概念类 2 ...
- 题解 P6005 【[USACO20JAN]Time is Mooney G】
抢第一篇题解 这题的思路其实就是一个非常简单的dijkstra,如果跑到第一个点的数据不能更新的时候就输出 很多人不知道要跑多少次才停.其实这题因为答案要减去 T*c^2,而每条边的值 <= 1 ...
- 微信H5支付demo
首先我们必须得在微信公众平台和微信商业平台那边配置好相关配置 1.注册微信服务号,开通微信支付权限绑定微信商业平台(这个具体怎么操作我就不说了) 2.获取应用(公众号)appid.应用(公众号)秘钥. ...