记录编号 201567 评测结果 AAAAAAAAAA
题目名称 [顾研NOIP] 旅游电车 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.200 s
提交时间 2015-10-30 20:58:42 内存使用 0.99 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 5002
int dfn[maxn],low[maxn],belong[maxn];
int n,m,stak[maxn],top,times,scc,tot,head[maxn];
bool vis[maxn],vist[maxn];
int flag[maxn];
struct dd{
	int begin,end,next;
}jie[50010];
void Clear(){
	memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
	memset(vis,false,sizeof(vis));
	memset(flag,0,sizeof(flag)); memset(head,0,sizeof(head));
	times=0;top=0;scc=0;tot=0;
}
inline int in(){
	int TEMP,EPX;
	TEMP=0;EPX=getchar();
	while(EPX<48||EPX>57)
		EPX=getchar();
	for(;EPX>47&&EPX<58;EPX=getchar())
		TEMP=(TEMP<<3)+(TEMP<<1)+EPX-48;
	return TEMP;
}
void add(int x,int y){
	jie[++tot].begin=x; jie[tot].end=y; jie[tot].next=head[x]; head[x]=tot;
}

void tar(int x){
	dfn[x]=low[x]=++times;vis[x]=1;
	stak[++top]=x;
	for(int i=head[x];i;i=jie[i].next){
		int yu=jie[i].end;
		if(!dfn[yu]){
			tar(yu);
			if(low[yu]<low[x]) low[x]=low[yu];
		}
		else
		 if(vis[yu])
		  if(dfn[yu]<low[x]) low[x]=dfn[yu];
	 }
	if(dfn[x]==low[x]){
		++scc;
		int yu=-1;
		do{
		   yu=stak[top--];vis[yu]=0;
		   belong[yu]=scc;
		}while(yu!=x);
	}
}
bool dfs(int x){
	vist[x]=1;
	for(int i=head[x];i;i=jie[i].next){
		if(vist[jie[i].end]) continue;
		if(belong[x]!=belong[jie[i].end]) return false;
		if(!dfs(jie[i].end)) return false;
	}
	return true;
}
void Judge(){
	for(int i=1;i<=n;++i){
		if(flag[belong[i]]==0){
			memset(vist,0,sizeof(vist));
			if(dfs(i)) {
				flag[belong[i]]=1; printf("%d ",i);
			}
			else flag[belong[i]]=-1;
		}
		else
		 if(flag[belong[i]]==1) printf("%d ",i);
	}
	printf("\n");
}
int main(){
    freopen("buss.in","r",stdin);
	freopen("buss.out","w",stdout);
	while(scanf("%d",&n)&&n){
		 Clear();
		 m=in();
		 for(int i=1;i<=m;++i){
			int x,y; x=in();y=in();
			add(x,y);
		}
		for(int i=1;i<=n;++i) if(!dfn[i]) tar(i);
		Judge();
	}
	return 0;
}