记录编号 190133 评测结果 AAAAAAAAAA
题目名称 [東方S1] 上白泽慧音 最终得分 100
用户昵称 Gravatar一個人的雨 是否通过 通过
代码语言 C++ 运行时间 0.029 s
提交时间 2015-10-02 16:22:19 内存使用 1.40 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int maxn=10000+100;
stack<int>s;
struct edge{
	int to,next;
}G[maxn*10];
int h[maxn],dfn[maxn],low[maxn],num=0;
int cnt[maxn],Index=0,id[maxn],tot=0,n,m;
bool instack[maxn];
vector<int>p[maxn];

void add(int x,int y){
	++tot; G[tot].to=y;
	G[tot].next=h[x]; h[x]=tot;
}

void tarjan(int x){
	dfn[x]=low[x]=++Index;
	s.push(x); instack[x]=1;
	for (int i=h[x];i;i=G[i].next)
	   if (!dfn[G[i].to]){
		  tarjan(G[i].to);
		  if (low[G[i].to]<low[x])
			 low[x]=low[G[i].to];
	   }
	   else if (instack[G[i].to]&&dfn[G[i].to]<low[x])
		  low[x]=dfn[G[i].to];
	if (dfn[x]==low[x]){
		num++; int k;
		do{
			k=s.top(); s.pop();
			instack[k]=0;
			id[k]=num; cnt[num]++;
			p[num].push_back(k);
		}while (k!=x);
	}
}

int main()
{
	freopen("classroom.in","r",stdin);
	freopen("classroom.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (int i=1;i<=m;++i){
		int x,y,z; scanf("%d %d %d",&x,&y,&z);
		if (z==1) add(x,y);
		else {add(x,y);add(y,x);}
	}
	memset(dfn,0,sizeof(dfn));
	memset(id,-1,sizeof(id));
	for (int i=1;i<=n;++i)//求分量
	   if (!dfn[i])
		  tarjan(i);
	vector<int>v; int maxx=0;
	for (int i=1;i<=num;++i)//处理最大分量
	   if (cnt[i]>maxx){
			maxx=cnt[i];
			v.clear(); v.push_back(i);
	   }
	   else if (cnt[i]==maxx) v.push_back(i);
	priority_queue<int>Q;//处理字典序
	for (int i=0;i<v.size();++i){
		int minn=0x7fffffff/3;
		for (int j=0;j<p[v[i]].size();++j)//比较谁的字典序更小
		   if (p[v[i]][j]<minn) minn=p[v[i]][j];
		if (!Q.empty()){//更新
			int k=-Q.top();
			if (k>minn){
				while (!Q.empty()) Q.pop();//清空
				for (int j=0;j<p[v[i]].size();++j)
				   Q.push(-p[v[i]][j]);
			}
		}
		else
           for (int j=0;j<p[v[i]].size();++j)
		      Q.push(-p[v[i]][j]);
	}
	printf("%d\n",maxx);
	while (!Q.empty()){
		int k=-Q.top();
		printf("%d ",k);
		Q.pop();
	}
	return 0;
}