记录编号 46331 评测结果 AAAAAAAAAA
题目名称 [東方S1] 上白泽慧音 最终得分 100
用户昵称 GravatarTruth.Cirno 是否通过 通过
代码语言 C++ 运行时间 0.149 s
提交时间 2012-10-27 15:54:59 内存使用 89.22 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <stack>
using namespace std;

int index,tim[5010],lowtim[5010],dad[5010],jhysnum[5010],waynum[5010],wayto[5010][5010];
bool insta[5010],used[5010];
stack<int> sta;

int findroot(int ys)
{
	int pos;
	stack<int> rec;
	while (!rec.empty())
		rec.pop();
	pos=ys;
	while (dad[pos])
	{
		rec.push(pos);
		pos=dad[pos];
	}
	while (!rec.empty())
	{
		dad[rec.top()]=pos;
		rec.pop();
	}
	return(pos);
}

void combine(int ysa,int ysb)
{
	ysa=findroot(ysa);
	ysb=findroot(ysb);
	if (ysa==ysb)
		return;
	if (jhysnum[ysa]>jhysnum[ysb])
	{
		jhysnum[ysa]+=jhysnum[ysb];
		dad[ysb]=ysa;
	}
	else
	{
		jhysnum[ysb]+=jhysnum[ysa];
		dad[ysa]=ysb;
	}
}

void tarjan(int pos)
{
	int i,to,temp;
	sta.push(pos);
	insta[pos]=true;
	used[pos]=true;
	tim[pos]=++index;
	lowtim[pos]=tim[pos];
	for (i=0;i<waynum[pos];i++)
	{
		to=wayto[pos][i];
		if (!used[to])
		{
			tarjan(to);
			lowtim[pos]=min(lowtim[pos],lowtim[to]);
		}
		else if (insta[to])
		{
			lowtim[pos]=min(lowtim[pos],tim[to]);
		}
	}
	if (lowtim[pos]==tim[pos])
	{
		temp=sta.top();
		insta[temp]=false;
		sta.pop();
		while (pos!=temp)
		{
			combine(pos,temp);
			temp=sta.top();
			insta[temp]=false;
			sta.pop();
		}
	}
}

int main(void)
{
	freopen("classroom.in","r",stdin);
	freopen("classroom.out","w",stdout);
	int i,n,m,x,y,type,maxjhysnum,maxjh,temp;
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
		jhysnum[i]=1;
	for (i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&type);
		if (type==1)
		{
			wayto[x][waynum[x]++]=y;
		}
		else
		{
			wayto[x][waynum[x]++]=y;
			wayto[y][waynum[y]++]=x;
		}
	}
	for (i=1;i<=n;i++)
	{
		if (!used[i])
			tarjan(i);
	}
	maxjhysnum=0;
	for (i=1;i<=n;i++)
	{
		temp=findroot(i);
		if (maxjhysnum<jhysnum[temp])
		{
			maxjhysnum=jhysnum[temp];
			maxjh=temp;
		}
	}	
	printf("%d\n",maxjhysnum);
	x=0;
	for (i=1;i<=n;i++)
		if (findroot(i)==maxjh)
		{
			if (x)
				printf(" ");
			else
				x=1;
			printf("%d",i);
		}
	printf("\n");
	return(0);
}