蒟蒻求助
查看原帖
蒟蒻求助
246979
SalomeJLQ楼主2020/8/3 10:26

感觉没啥问题。

为什么这个代码样例数据输出

2

1 5

连样例都过不了

实在查不出问题。所以求助: 下面是代码

#include<set>
#include<map>
#include<stack>
#include<cstdio>
#include<queue>
#include<cmath>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<istream>
#include<string.h>
#include<ostream>
#include<iostream>
#include<algorithm>
using namespace std;
int  read(){
	int f=1,x=0;char ch = getchar();
	while(!isdigit(ch)){
		if(ch=='-' )f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){x=x*10+(ch-'0');ch=getchar();}
	return f*x;
}
struct Edge{int to,next;}edge[200010];
int dfn[100005],low[100005],head[100005],cnt,n,m,ans,Dfn,i,j,u,v;
bool pd[100005];
void build(int x,int y){
	++cnt;
	edge[cnt].to=y;
	edge[cnt].next=head[x];
    head[x]=cnt;
}
void tarjan(int now,int  father,int son){
	Dfn++;
	dfn[now]=low[now]=Dfn;
	for(int ii=head[now];ii;ii=edge[ii].next){
		if(!dfn[edge[ii].to]){
			tarjan(edge[ii].to,father,0);
			low[now]=min(low[now],low[edge[ii].to]);
			if(low[edge[ii].to]>=dfn[now]&&edge[ii].to!=father)pd[now]=true;
			if(now==father)son++;
		}
		low[now]=min(low[now],dfn[edge[ii].to]);
	}
	if((son>1)&&(now==father))pd[now]=true;
}
int main(){
    memset(dfn,0,sizeof(dfn));
    memset(head,0,sizeof(head));
	n=read();m=read();
	for(i=1;i<=m;i++){
		cin>>u>>v;
		build(u,v);build(v,u);
	}
	for(i=1;i<=n;i++)
		if(!dfn[i])tarjan(i,i,0);
	for(i=1;i<=n;i++)
	if(pd[i])ans++;
	cout<<ans<<endl;
	for(i=1;i<=n;i++)
		if(pd[i])cout<<i<<" ";
	return 0;
}
2020/8/3 10:26
加载中...