| 记录编号 |
294818 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
921.[東方S1] 上白泽慧音 |
最终得分 |
100 |
| 用户昵称 |
AntiLeaf |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.000 s |
| 提交时间 |
2016-08-12 19:13:33 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5010,maxe=50010;
struct edge{
int to,prev;
edge():prev(0){}
}e[maxe];
void insert(int,int);
void Tarjan(int);
int n,m,x,y,z,len=0,last[maxn]={0},v[maxn],top=0,dfn[maxn],low[maxn],tim=0;
int size[maxn]={0},belong[maxn],cnt=0,ans=0,tmp;
bool ins[maxn]={false};
inline int MAIN(){
#define MINE
#ifdef MINE
freopen("classroom.in","r",stdin);
freopen("classroom.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&x,&y,&z);
if(z==1)insert(x,y);
else if(z==2){
insert(x,y);
insert(y,x);
}
}
for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i);
for(int i=1;i<=n;i++)if(size[belong[i]]>ans){
ans=size[belong[i]];
tmp=belong[i];
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)if(belong[i]==tmp)printf("%d ",i);
return 0;
}
void insert(int x,int y){
e[++len].to=y;
e[len].prev=last[x];
last[x]=len;
}
void Tarjan(int x){
int y;
dfn[x]=low[x]=++tim;
v[++top]=x;
ins[x]=true;
for(int i=last[x];i;i=e[i].prev){
y=e[i].to;
if(!dfn[y]){
Tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(ins[y])low[x]=min(low[x],dfn[y]);
}
if(dfn[x]==low[x]){
cnt++;
do{
y=v[top--];
ins[y]=false;
size[cnt]++;
belong[y]=cnt;
}while(x!=y);
}
}
int hzoier=MAIN();
int main(){;}