记录编号 295556 评测结果 AAAAAAAAAA
题目名称 [顾研NOIP] 旅游电车 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 1.273 s
提交时间 2016-08-13 21:02:08 内存使用 17.40 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=500010;
struct edge{
	int to,prev;
	edge():prev(0){}
}e[maxn<<1];
void insert(int,int,int*);
void dfs1(int);
void dfs2(int);
int n,m,last[maxn],relast[maxn],len,tim,belong[maxn],top,b[maxn];
pair<int,int>a[maxn];
int cnt,x,y,d[maxn];
bool vis[maxn]={false};
int main(){
#define MINE
#ifdef MINE
	freopen("buss.in","r",stdin);
	freopen("buss.out","w",stdout);
#endif
	label:
	scanf("%d%d",&n,&m);
	if(!n)return 0;
	len=tim=top=cnt=0;
	memset(last,0,sizeof(last));
	memset(relast,0,sizeof(relast));
	memset(vis,0,sizeof(vis));
	memset(belong,0,sizeof(belong));
	memset(d,0,sizeof(d));
	while(m--){
		scanf("%d%d",&x,&y);
		insert(x,y,last);
		insert(y,x,relast);
	}
	for(int i=1;i<=n;i++)if(!vis[i])dfs1(i);
	for(int i=n;i;i--)if(!belong[b[i]])dfs2(b[i]);
	for(int x=1;x<=n;x++){
		for(int i=last[x];i;i=e[i].prev)if(belong[x]!=belong[e[i].to])d[belong[x]]++;
	}
	for(int i=1;i<=n;i++)if(!d[belong[i]])printf("%d ",i);
	printf("\n");
	goto label;
	return 0;
}
void insert(int x,int y,int *last){
	e[++len].to=y;
	e[len].prev=last[x];
	last[x]=len;
}
void dfs1(int x){
	a[++top]=make_pair(x,last[x]);
	vis[x]=true;
	int i;
	while(top){
		x=a[top].first;
		i=a[top].second;
		while(i&&vis[e[i].to])i=e[i].prev;
		if(i){//扩展
			a[top].second=e[i].prev;
			vis[e[i].to]=true;
			a[++top]=make_pair(e[i].to,last[e[i].to]);
		}
		else{//回溯
			b[++tim]=x;
			top--;
		}
	}
}
void dfs2(int x){
	a[++top]=make_pair(x,relast[x]);
	vis[x]=true;
	belong[x]=++cnt;
	int i;
	while(top){
		x=a[top].first;
		i=a[top].second;
		while(i&&belong[e[i].to])i=e[i].prev;
		if(i){//扩展
			a[top].second=e[i].prev;
			belong[e[i].to]=cnt;
			a[++top]=make_pair(e[i].to,relast[e[i].to]);
		}
		else{//回溯
			top--;
		}
	}
}