cf999E (强联通分量模板题)】的更多相关文章

给出n个点m条边的有向图,问至少添加多少条边使得任何点都可以从s点出发可达 #include<bits/stdc++.h> #define forn(i, n) for (int i = 0 ; i < int(n) ; i++) #define fore(i, s, t) for (int i = s ; i < (int)t ; i++) #define fi first #define se second #define all(x) x.begin(),x.end() #d…
题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为牛C是红人,那么牛A也认为牛C是红人.求被其他所有牛认为是红牛的牛的总数. 解题思路:把所有牛看成顶点,把有序对(A,B)看成从A到B的有向边,那么题目就变成了求所有顶点都可到达的顶点的总数.我们可以得到一个结论,如果一个强连通分量里有一头牛被认为是红人,那么该强联通分量里的所有牛都是红人,这显然是…
/*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h> #define N 1100 int top[N],ma[N][N],dfn[N],low[N],index,f[N][N],n; int Min(int a,int b) { return a>b?b:a; } void tarjan(int u,int pre) {// dfn[u]=lo…
void tarjan(int u) { dfn[u]=low[u]=++dfs_clock; stack_push(u); for (int c=head[u];c;c=nxt[c]) { int v=to[c]; if (!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if (!scc[v]) low[u]=min(low[u],dfn[v]); } if (low[u]==dfn[u]) { scc_cnt++; int cu…
知识讲解: 在代码里我们是围绕 low 和 dfn 来进行DFS,所以我们务必明白 low 和 dfn 是干什么的? 有什么用,这样才能掌握他.   1.  dfn[]  遍历到这个点的时间 2.  low[]  遍历到这个所能连接到的最短时间,说明那个最短时间可以遍历带他,他也可以走到那个最短时间. 3.  我们每次出栈的点就是一个强联通分量(这里建议观看一下课件里面的Tarjan求强联通算法的模拟过程).   #include<cstdio> #include<cstdlib>…
// https://www.cnblogs.com/stxy-ferryman/p/7779347.html ; struct EDGE { int to, nt; }e[N*N]; int head[N], tot; void addE(int u,int v) { e[tot].to=v; e[tot].nt=head[u]; head[u]=tot++; } int dfn[N], low[N], ind; int col[N], id; bool vis[N]; stack <int>…
题意 给定一个 n∗n 的矩阵 A,每个元素都非负判断是否存在一个整数 k 使得 A^k 的所有元素 >0 n≤2000(矩阵中[i][i]保证为1) 题解 考虑矩阵$A*A$的意义 ,设得到的矩阵为B矩阵中的一个元素$B[i][j]=\sum_{k=1}^{n}A[i][k]*A[k][j]$,$A[i][k]*A[k][j]$非负当且仅当$A[i][k]$和$A[k][j]$非负.这跟$弗洛伊德$差不多,枚举中间点,我们把$A[i][j]$非负理解为一个图中有一条$A$从$i$到$j$的边,…
题意: 怎么说呢...这种题目有点概括不来....还是到原题面上看好了... SOL: 求出强联通分量然后根据分量重构图,如果只有一个点没有出边那么就输出这个点中点的数目. 对就是这样. 哦还有论边双与强联通的tarjan的不同...边双要记录边...无向图的边有两条要判断是不是一条...还有什么不同呢...我也不造了...看起来很像很好写就对了... Code: /*================================================================…
提到Tarjan算法就不得不提一提Tarjan这位老人家 Robert Tarjan,计算机科学家,以LCA.强连通分量等算法闻名.他拥有丰富的商业工作经验,1985年开始任教于普林斯顿大学.Tarjan于1986年获得图灵奖.并于1994年当选为ACM院士. Tarjan其他奖项包括: 奈望林纳奖信息科学(1983第一个获奖者) 国家科学院的研究倡议奖 (1984) 巴黎Kanellakis奖-理论与实践( ACM1999) 帕斯卡奖章数学与计算机科学( 欧洲科学院2004) 加州理工学院杰出…
题目链接:https://vijos.org/p/1023 最近在练强联通分量,当然学的是tarjan算法 而这一道题虽然打着难度为3,且是tarjan算法的裸题出没在vijos里面 但其实并不是纯粹只需要tarjan求有几个强联通就可以过的(我以为这是所谓的裸题) 其实这题还需要对每一个强联通缩点,可能被所谓裸题误导的OIer们看不破这个 毕竟,这个样例数据也是坑啊,样例数据都可以说是无向图了,哪里还是什么有向图 所以样例数据不是万能的,但是没过样例数据是万万不能的 至于为什么缩点我们来想一想…