样例错误,检查了很久也没检查出来,求助!
查看原帖
样例错误,检查了很久也没检查出来,求助!
337410
御坂10026号楼主2020/8/6 11:34

RT

#include<cstdio>
#include<stack>
using namespace std;
int n,m;
int t,u[50005],v[50005],now[5005],before[50005],dfn[5005],low[5005],time=0,color[5005],cnt[5005],sum=0,ans=0,k=0,maxn=0;
stack <int> st;
bool in[5005];
void tarjan(int x){
	dfn[x]=low[x]=++time;
	in[x]=true;
	st.push(x);
	for(int i=now[x];i!=-1;i=before[i]){
		int y=v[i];
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(in[y])
			low[x]=min(low[x],dfn[y]);
	}
	if(dfn[x]==low[x]){
		int temp=-1;
		sum++;
		while(temp!=x){
			temp=st.top();
			st.pop();
			in[temp]=false;
			color[temp]=sum;
			cnt[sum]++;
		}
	}
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		now[i]=-1;
	for(int i=1;i<=m;i++){
		k++;
		scanf("%d%d%d",&u[k],&v[k],&t);
		before[k]=now[u[k]];
		now[u[k]]=k;
		if(t==2){
			k++;
			u[k]=v[k-1];
			v[k]=u[k-1];
			before[k]=now[u[k]];
			now[u[k]]=k;
		}
	}
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			tarjan(i);
	for(int i=1;i<=sum;i++)
		if(cnt[i]>maxn){
			maxn=cnt[i];
			ans=i;
		}
	printf("%d\n",ans);
	for(int i=1;i<=n;i++)
		if(color[i]=ans)
			printf("%d ",i);
	return 0;
}

Tarjan应该没问题,边处理也没问题吧?

2020/8/6 11:34
加载中...