记录编号 295628 评测结果 AAAAAAAAAA
题目名称 [東方S1] 上白泽慧音 最终得分 100
用户昵称 GravatarSky_miner 是否通过 通过
代码语言 C++ 运行时间 0.039 s
提交时间 2016-08-14 06:32:36 内存使用 1.17 MiB
显示代码纯文本
#include <cstdio>
const int maxn = 5010;
using namespace std;
inline void read(int &x){
	x=0;char ch;
	while(ch=getchar(),ch<'!');
	while(x=10*x+ch-'0',ch=getchar(),ch>'!');
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
struct Edge{
	int to,next;
}G[100100];
int tot,head[maxn],scc_cnt,dfs_cnt;
int dfn[maxn],low[maxn],sccno[maxn];
int sta[maxn],top,num[maxn];
void add(int u,int v){
	G[++tot].to = v;
	G[tot].next = head[u];
	head[u] = tot;
}
#define v G[i].to
void dfs(int u){
	low[u] = dfn[u] = ++dfs_cnt;
	sta[++top] = u;
	for(int i=head[u];i;i=G[i].next){
		if( !dfn[v] ){
			dfs(v);
			low[u] = cat_min(low[u],low[v]);
		}else if( !sccno[v] ) low[u] = cat_min(low[u],dfn[v]);
	}
	if( low[u] == dfn[u] ){
		++scc_cnt;
		while(1){
			int x = sta[top--];
			sccno[x] = scc_cnt;
			++num[scc_cnt];
			if( x == u ) break;
		}
	}
}
int main(){
	freopen("classroom.in","r",stdin);
	freopen("classroom.out","w",stdout);
	int n;read(n);
	int m;read(m);
	int x,y,op;
	for(int i=1;i<=m;++i){
		read(x);read(y);read(op);
		add(x,y);
		if( op == 2 ) add(y,x);
	}
	for(int i=1;i<=n;++i) if( !dfn[i] ) dfs(i);
	int max1 = 0,pos = 0;
	for(int i=1;i<=scc_cnt;++i){
		if( num[i] > max1 ){
			max1 = num[i];
			pos = i;
		}
	}
	printf("%d\n",max1);
	for(int i=1;i<=n;++i){
		if( sccno[i] == pos ){
			printf("%d ",i);
		}
	}
	return 0;
}