记录编号 333689 评测结果 AAAAAAAAAA
题目名称 [顾研NOIP] 旅游电车 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 1.894 s
提交时间 2016-10-31 09:39:49 内存使用 24.93 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<stack>
#define file(x) "buss."#x
using std::min;
using std::max;
const int MAXE=50010,MAXV=5010;
int n,m,sz,hed[MAXV],nxt[MAXE],scnt,dfsclk,dfn[MAXV],scid[MAXV];
bool be[MAXV][MAXV];
std::vector<int> scom[MAXV],ans;
struct EDGE{int u,v;}st[MAXE];
void add(int u,int v){
	st[++sz].u=u,st[sz].v=v;
	nxt[sz]=hed[u],hed[u]=sz;
}
std::stack<int> sk;
int dfs(int u){
	sk.push(u);
	int lowu=dfn[u]=++dfsclk,v;
	for(int e=hed[u];e;e=nxt[e]) {
		if(!dfn[v=st[e].v]) lowu=min(lowu,dfs(v));
		else if(!scid[v]) lowu=min(lowu,dfn[v]);
	}
	if(dfn[u]==lowu){
		int x;
		++scnt;
		do{
			x=sk.top();sk.pop();
			scid[x]=scnt;
			scom[scnt].push_back(x);
		}while(x!=u);
	}
	return lowu;
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	while(scanf("%d%d",&n,&m)==2){
		for(int i=1;i<=scnt;i++) scom[i].clear();
		sz=scnt=dfsclk=0;
		memset(dfn,0,sizeof(dfn));
		memset(scid,0,sizeof(scid));
		memset(hed,0,sizeof(hed));
		memset(be,0,sizeof(be));
		ans.clear();
		for(int i=1;i<=m;i++) {
			int u,v;scanf("%d%d",&u,&v);
			add(u,v);
		}
		for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
		for(int i=1;i<=sz;i++){
			int u=scid[st[i].u],v=scid[st[i].v];
			if(u!=v) be[u][v]=1;
		}
		for(int i=1;i<=scnt;i++){
			bool f=0;
			for(int j=1;j<=scnt;j++) if(be[i][j]){
				f=1;
				break;
			}
			if(!f)
				for(int j=0;j<scom[i].size();j++) ans.push_back(scom[i][j]);
		}
		std::sort(ans.begin(),ans.end());
		for(int i=0;i<ans.size();i++) printf("%d ",ans[i]);
		printf("\n");
	}
}