记录编号 |
46331 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[東方S1] 上白泽慧音 |
最终得分 |
100 |
用户昵称 |
Truth.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);
}