#4#22等WA,50分求调
查看原帖
#4#22等WA,50分求调
1358038
Tgdoem楼主2025/1/25 14:10

WA了#4#5#8#11#13#22

#include<bits/stdc++.h>
using namespace std;
const int N=4e6+5;
int ne[N],to[N],he[N],df[N],ba[N],fr[N],st[N];//next,to,head,dfs,back,from,stack
bool v[N];
vector<int>bc[N];//Biconnected_Component
int ti=0,bc_num=0,st_num=0;//time,Biconnected_Component_num,stack_num
void dfs(int u,int fa=0){
	df[u]=ba[u]=++ti;
	st[++st_num]=u;
	for(int i=he[u];i;i=ne[i]){
		int t=to[i];
		if(!df[t]){
			dfs(t,u);
			ba[u]=min(ba[u],ba[t]);
		}else if(t!=fa&&df[t]<df[u])ba[u]=min(ba[u],df[t]);
	}
	if(ba[u]==df[u]){
		bc_num++;
		while(st_num){
			int i=st[st_num--];
			bc[bc_num].push_back(i);
			if(i==u)break;
		}
	}
	return ;
}
void cha(int f,int t,int n){//from,to,num
	ne[n]=he[f];
	fr[n]=f;
	to[n]=t;
	he[f]=n;
	return ;
}
/*
P8436_4.in
5 7
4 2
5 4
4 2
3 2
1 2
1 1
2 1

P8436_4.out
3
1 3
1 5
3 1 2 4
*/ 
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int a,b;
		cin>>a>>b;
		if(a==b)continue;
		cha(a,b,i);
		cha(b,a,i+m);
	}
	int allow_num=0;
	for(int i=1;i<=n;i++)if(!he[i])allow_num++;
	for(int i=1;i<=n;i++)if(!df[i]&&he[i])dfs(i);
	cout<<bc_num+allow_num<<"\n";
	for(int i=1;i<=n;i++)if(!he[i])cout<<"1 "<<i<<"\n"; 
	for(int i=1;i<=bc_num;i++){
		cout<<bc[i].size()<<" ";
		for(int j=0;j<bc[i].size();j++)cout<<bc[i][j]<<" ";
		cout<<"\n";
	}
	return 0;
}
2025/1/25 14:10
加载中...