csu 1526: Beam me out!(强连通分量 Tarjan)

2024-06-15 19:32
文章标签 连通 tarjan 分量 beam csu 1526

本文主要是介绍csu 1526: Beam me out!(强连通分量 Tarjan),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从1开始的所有路径 是否都能到达n 所用的步数是否是无限的

1)判断n是否可达

2)判断是否有环

3)判断是否所有的点都可以从1开始可达


#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define INF 99999999
#define ll __int64
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)using namespace std;void read(int &x)
{char ch;x=0;while(ch=getchar(),ch!=' '&&ch!='\n'){x=x*10+ch-'0';}
}const int MAXN=50010;
const int MAXM=5000010;
//判断是否有环 是否可达n
struct Edge
{int to,next;
}edge[MAXM];
int head[MAXN],tot;
int low[MAXN],dfn[MAXN],sta[MAXN],belong[MAXN];
int Index,top;
int scc;
int instack[MAXN];
int cirflag,canreach;
int n,m;
int cd[MAXN];void addedge(int u,int v)
{edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++;
}void Tarjan(int u)
{if(u==n) canreach=1;int v;low[u]=dfn[u]=++Index;sta[top++]=u;instack[u]=1;for(int i=head[u];i!=-1;i=edge[i].next){v=edge[i].to;if(u==v)  cirflag=1;if(!dfn[v]){Tarjan(v);low[u]=min(low[u],low[v]);}else if(instack[v])low[u]=min(low[u],dfn[v]);}if(low[u]==dfn[u]){scc++;do{v=sta[--top];instack[v]=0;belong[v]=scc;}while(v!=u);}
}void solve()
{MEM(dfn,0);MEM(instack,0);MEM(cd,0);Index=scc=top=cirflag=canreach=0;Tarjan(1);for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=edge[j].next){int k=edge[j].to;int u=belong[i];int v=belong[k];if(u!=v){cd[u]++;}}}int cnt=0;for(int i=1;i<=scc;i++)if(cd[i]==0)cnt++;int sum=0;for(int i=1;i<=n;i++){if(dfn[i]!=0)sum++;}if(sum!=scc)//判断是不是所有的点都在联通分量里面cirflag=1;if(cnt==1&&canreach)printf("PARDON ");else printf("PRISON ");if(!cirflag) puts("LIMITED");else puts("UNLIMITED");
}void init()
{tot=0;MEM(head,-1);
}int main()
{
//    fread;
//    int n;while(scanf("%d",&n)!=EOF){init();
//        int m;for(int i=1;i<n;i++){scanf("%d",&m);for(int j=0;j<m;j++){int v;scanf("%d",&v);addedge(i,v);}}solve();}return 0;
}




这篇关于csu 1526: Beam me out!(强连通分量 Tarjan)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064369

相关文章

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

像素间的关系(邻接、连通、区域、边界、距离定义)

文章目录 像素的相邻像素4邻域D邻域8邻域 邻接、连通、区域和边界邻接类型连通区域边界 距离测度欧氏距离城市街区距离(city-block distance)棋盘距离(chessboard distance) 参考 像素的相邻像素 4邻域 坐标 ( x , y ) (x,y) (x,y)处的像素 p p p有2个水平的相邻像素和2个垂直的相邻像素,它们的坐标是: ( x

Apache Beam 大数据处理一站式分析

大数据技术与架构 点击右侧关注,大数据开发领域最强公众号! 暴走大数据 点击右侧关注,暴走大数据! 一. 介绍 大数据处理其实经常被很多人低估,缺乏正确的处理体系,其实,如果没有高质量的数据处理流程,人工智能将只有人工而没有智能。现在的趋势是数据体量不断上涨,团队却低估了规模所带来的复杂度。大数据领域泰斗级人物Jesse Anderson曾做过研究,一个组织架构比较合理的人工智能团队,

OpenCV结构分析与形状描述符(6)带统计的连通组件计算函数connectedComponentsWithStats()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 connectedComponentsWithStats 函数计算布尔图像的连通组件标记图像,并为每个标记产生统计信息。 该函数接受一个具有4或8连通性的二值图像,并返回 N,即标签总数(标签范围为 [0, N-1],其中 0 代表背景标签)

最小连通网络

使用网络中的n-1条边来连接网络中的n个顶点 不产生回路 各边上的权值总和达到最小 prim算法:针对顶点展开,适合边的数量较多的情况 kruskal算法:针对边展开的,适合边的数量较少的情况

【HDU】2242 考研路茫茫——空调教室 双连通分量+树型DP

考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1978    Accepted Submission(s): 576 Problem Description 众所周知,HDU的考研教室是没

【HDU】3861 The King’s Problem 强连通缩点+有向图最小路径覆盖

传送门:【HDU】3861 The King’s Problem 题目分析:首先强连通缩点,因为形成一个环的王国肯定在一条路径中,这样才能保证拆的少。 然后缩点后就是DAG图了,由于题目要求的是最小路径覆盖,那么二分匹配即可。 代码如下: #include <cstdio>#include <cstring>#include <algorithm>#includ

【Live Archive】6393 Self-Assembly【强连通】

传送门:【Live Archive】6393 Self-Assembly 题目分析: 假设我们只用到向上或者向右的块,这样我们只要找到一个回路使得某个块可以和第一个块一样,那么我们就相当于找到了一个循环,这样就可以无限循环了。 但是我们要怎样去找这么一个环?考虑到必须是对应字母 X+,X− X^+,X^-才能建边,然后一个环中一定是多个一对一对的这样的对应字母组成的。 可以发现块的数量那么