85分求救
查看原帖
85分求救
261574
rmzls楼主2022/8/19 22:35

求救。。 1 3 12wa了 好像说是有重边但是加了判断还wa 求大佬帮忙看看

#include<bits/stdc++.h>
using namespace std;
bool dfv[500005];
int dfn[500005],low[500005];
vector<vector<int> > g;
vector<vector<int> > ans;
vector<vector<int> > isb;
int num=0,am=0,n,m;
void taj(int x,int a){
	//cout<<2<<' ';
	num++;
	low[x]=dfn[x]=num;
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i];
		if(dfn[y]==0){		
			taj(y,x); 
			low[x]=min(low[x],low[y]);
			if(low[y]>dfn[x]){
				isb[x].push_back(y);
				isb[y].push_back(x);
			}
		}
		else if(g[x][i]!=a){
			low[x]=min(low[x],dfn[y]);
		}
	}
}
void dfs(int x){
	dfv[x]=true;
	//cout<<1<<' ';
	if(x!=0){
		ans[am].push_back(x);
	}	
	for(int i=0;i<g[x].size();i++){
		int y=g[x][i];
		if(!dfv[y]){
			bool flag=true;
			for(int k=0;k<isb[x].size();k++){
				if(isb[x][k]==y){
					flag=false;
					break;
				}
			}
			for(int k=0;k<isb[y].size();k++){
				if(isb[y][k]==x){
					flag=false;
					break;
				}
			}
			if(flag){
			dfs(y);	
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	g.resize(n+3);
	ans.resize(n+3);
	isb.resize(n+3);
	for(int i=1;i<=m;i++){
		int sdo,fi;
		bool flag=false;
		scanf("%d%d",&sdo,&fi);
		for(int k=0;k<g[sdo].size();k++){
			if(g[sdo][k]==fi){
				flag=true;
				break;
			}
		}
		for(int k=0;k<g[fi].size();k++){
			if(g[fi][k]==sdo){
				flag=true;
				break;
			}
		}
		if(flag){
			continue;
		}
		else{
			g[sdo].push_back(fi);
			g[fi].push_back(sdo);
		}
	}
	for(int i=1;i<=n;i++){
		if(dfn[i]==0){
			taj(i,0);
		}
	}
	cout<<endl;
	for(int i=1;i<=n;i++){	
		if(!dfv[i]){
			am++;
			dfs(i);
		}
	}
	printf("%d\n",am);
	for(int i=1;i<=am;i++){
		printf("%d ",ans[i].size());
		for(int j=0;j<ans[i].size();j++){
			printf("%d ",ans[i][j]);
		}
		printf("\n");
	}
	return 0;
} 
2022/8/19 22:35
加载中...