强联通分量整理板子

#include<cstdio>

using namespace std;

const int maxn=1e5+5;

struct edge{
	int to,val;
};
vector<edge> G[maxn];
int dfn[maxn];
int low[maxn];
int cnt;
bool ins[maxn];
stack<int> s;
int timing;
int color[maxn];
int colorcnt[maxn];
void tarjian(int u){
 timing++;
 dfn[u]=low[u]=timing;
 s.push(u);
 ins[u]=true;
 for (int v:G[u]){
 	if (dfn[v]==0)
 	 tarjian(v);
 	 low[u]=min(low[u],low[v]);
    }
    else if (ins[v]==true){
 	  low[u]=min(low[u],dfn[v]);
   }
   if (dfn[u]==low[u]){
   	colorcnt++;
   	 while (s.top!=u){
   	 	  int temp=s.top();
   	 	  s.pop();
   	 	  ins[temp]=false;
   	 	  color[temp]=colorcnt;
		  colornum[colorcnt]++;
		}
		s.pop();
		color[u]=colorcnt;
		colornum[colorcnt]++;
        ins[u]=false; 
   }
} 
int main(){
	int n,m;
    int x,y;
	for (int i=1;;i<=m;++i)
	{ 
	 scanf("%d%d",&x,&y);
      G[x].push_back(y);
      G[y].push_back(x);
	}
	for (int i=1;i<=n;i++)
	  {
	  	if (dfn[i]==0)
	  	tarjian(i);
	  }
	
	
	return 0;
} 
```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值