边双50pts求调
查看原帖
边双50pts求调
593299
Qerucy楼主2024/10/23 07:45

rt,窝手膜了几组重边和自环的样例都没寄,求调或hack

代码:

#include<bits/stdc++.h>

using namespace std;

int n,m;
int a[500010];
int x[500010],y[500010];
int tim,cnt;
int id[500010];
int dfn[500010];
int low[500010];
bool vis[500010];
bool in[500010];
int tot=1;
bool qwq[500010];
int ans;

struct node{
	int to,id;
};

vector<node>v[500010];
vector<int>ne[500010];
stack<int>s;

void tarjan(int x){
	dfn[x]=++tim;
	low[x]=dfn[x];
	s.push(x);
	in[x]=1;
	for(int i=0;i<v[x].size();i++){
		if(qwq[v[x][i].id]) continue;
		qwq[v[x][i].id]=qwq[v[x][i].id^1]=1;
		int to=v[x][i].to;
		if(dfn[to]){
			if(in[to]) low[x]=min(low[x],low[to]);
			continue;
		}
		tarjan(to);
		low[x]=min(low[x],low[to]);
	}
	if(dfn[x]==low[x]){
		id[x]=++cnt;
		ne[cnt].push_back(x);
		in[x]=0;
		while(!s.empty()){
			if(s.top()==x){
				s.pop();
				break;
			}
			int now=s.top();
			s.pop();
			id[now]=cnt;
			ne[cnt].push_back(now);
			in[now]=0;
		}
	}
}

int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x[i],&y[i]);
		v[x[i]].push_back((node){y[i],++tot});
		v[y[i]].push_back((node){x[i],++tot});
	}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	
	printf("%d\n",cnt);
	for(int i=1;i<=cnt;i++){
		printf("%d ",ne[i].size());
		for(auto x:ne[i]){
			printf("%d ",x);
		}
		puts("");
	}
	return 0;
}
2024/10/23 07:45
加载中...