首页 > 其他分享 >强连通分量

强连通分量

时间:2024-08-05 11:08:03浏览次数:10  
标签:连通 sta ll back ins dfn low 分量

CF427C Checkposts

#include<bits/stdc++.h>
#define mid (((l)+(r))/2)
using namespace std;
typedef long long ll;
typedef long double ld;
const ll N=1e5+10,inf=1e18+10,mod=1e9+7;
ll n,m,a[N],tot,dfn[N],low[N];
bool ins[N];
vector<ll> G[N];
stack<ll> sta;
vector<vector<ll> > scc;
void tarjan(ll u){
	dfn[u]=low[u]=++tot,sta.push(u),ins[u]=true;
	for(auto v:G[u]){
		if(!dfn[v])tarjan(v);
		if(ins[v])low[u]=min(low[u],low[v]);
	}
	if(low[u]==dfn[u]){
		scc.push_back(vector<ll>());
		while(ins[u])ins[sta.top()]=false,scc.back().push_back(sta.top()),sta.pop();
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin >> n;
	for(ll i=1;i<=n;i++)cin >> a[i];
	cin >> m;
	for(ll i=1;i<=m;i++){
		ll u,v;
		cin >> u >> v;
		G[u].push_back(v);
	}
	for(ll i=1;i<=n;i++)if(!dfn[i])tarjan(i);
	ll cost=0,ans=1;
	for(auto i:scc){
		ll l=inf,cnt=0;
		for(auto j:i)l=min(l,a[j]);
		for(auto j:i)if(a[j]==l)cnt++;
		cost+=l,ans*=cnt,ans%=mod;
	}
	cout << cost << ' ' << ans;
	return 0;
}

标签:连通,sta,ll,back,ins,dfn,low,分量
From: https://www.cnblogs.com/alric/p/18342817

相关文章

  • 边分治维护强连通分量(CF1989F,P5163)
    这里的边分治和树上的点分治边分治不一样,是维护强连通分量用的,每条边有一个出现时间,通过将每条边按连通关系分流重新排列,从而维护每个时间点整张图的连通性。具体的,这个算法是维护这样的一类问题:n个点,m条边按时间顺序依次加入,每加入一条边,你需要回答一些问题,比如在这个时间点......
  • Tarjan 与连通性
    tarjan是一系列与图连通性相关的算法的统称,本文将总结常见的tarjan算法。并配合一定量的练习。无向图求割边割点割点:删掉后让整个图不联通的点。割边(桥):删掉后让整个图不联通的边。搜索树:对图进行dfs时经过的边的集合。容易发现其构成一棵树。搜索树上的边称为树边。时间......
  • Tarjan算法和连通性相关(三)
    上一篇博客我们介绍了割点和桥,本文我们继续学习与连通性有关的一些概念边双连通分量什么是边双连通分量?在一张连通的无向图中,对于两个点u和v,如果无论删去哪条边(只能删去一条)都不能使它们不连通,我们就说u和v边双连通,边双联通分量是极大的边双连通子图怎么求边双连通......
  • Tarjan算法和连通性相关(二)
    上一篇博客我们介绍了强连通分量,本文我们继续学习与连通性有关的一些概念割点什么是割点?对于一个无向图,如果把一个点删除后这个图的极大连通分量数增加了,那么这个点就是这个图的割点我们画个图理解一下:在这个图中,如果我们把3这个点给删除掉,那么这张图就会被拆分成两个部......
  • Tarjan算法与连通性相关(一)
    昨天在打牛客多校的时候遇到了一道与连通性有关的图论题,笔者一眼就看出这题考察的知识点是Tarjan算法,但是笔者上次写Tarjan算法还是三年前的事情(太惭愧了qaq),于是笔者和队友在赛时花了一个小时时间学习了Tarjan算法成功通过了此题,故写下这篇博客进一步加深印象,同时也是分享自己对于......
  • 桥与边双联通分量
    板子和常识https://oi-wiki.org/graph/bcc/板子用的是tarjan算法2的思想只能跑无向图理论基础SCC部分对于一个连通分量图,我们很容易想到,在该连通图中有且仅有一个\(u\)使得$\texttt{dfn}_u=\texttt{low}_u$。该结点一定是在深度遍历的过程中,该连通分量中第一个......
  • 【笔记】图论:2-sat、连通性、欧拉回路选讲
    [AGC059C]GuessingPermutationforasLongasPossible(2-sat)这个东西十分智障,只需要对于所有\(a,b,c\),如果询问顺序是\((a,b),(b,c),(a,c)\),那么不能\(a<b<c\)或\(a>b>c\)。其它的情况(一条链)你一看发现肯定需要出现上述情况,那么这就是充要条件。你一看你直接对所......
  • Tarjan 算法及连通性问题
    无向图的连通性dfs树dfs树上存在树边和返祖边,不存在横叉边。割点若一点\(u\)是割点,那么必定存在一个儿子,删去\(u\)后和他的父亲不连通。如果不存在,和\(u\)相连的所有点依然联通,那么连通性不变,不是割点。若是根节点,若有至少\(2\)个儿子那么就是割点。判断一个点不......
  • 强连通分量-缩点
    初学只需要背代码就好了,而复习的时候要考虑的就多了((打牛客的时候用到,发现忘得差不多了)概念解读连通:在无向图中,从任意点A都可以到达任意点B。强连通:在有向图中,从任意点A都可以到达任意点B。弱连通:将有向图看作无向图后,从任意点A都可以到达任意点B。特殊地,单独的点......
  • Tarjan(连通性相关) 笔记
    概念点(vertex)、边(edge)无向图中若图中存在两点可以到达,则称这两个点是连通的(connected)若图中任意两点都连通,则称该无向图为连通图(connectedgraph)若图\(G\)中存在一个连通子图\(H\)(\(H\subseteqG\)),没有严格更大的连通子图\(I\)使\(H\varsubsetneqqI\),则称\(H\)......