裸的tarjan。可是我有个问题
不知道是数据太水还是我理解错了,我用一个没比字典序的程序竟然AC了,(这说明数据没有多种最大的的,我认为字典序输出是输出字典序小的 ,不是吗? )
下面是加字典序的代码
#include<cstdio>
#include<iostream>
using namespace std;
int n,m;
const int M=200000;
int head[M],to[M],nex[M];
int tot;
int vis[M];
int zhan[M];
int t[M],s[M];
void add(int x,int y)
{
nex[++tot]=head[x];
to[tot]=y;
head[x]=tot;
}
int num;
int col[M];
int dfn[M];
int low[M];
int top;
int numc;
void tarjan(int x)
{
dfn[x]=++num;
low[x]=num;
vis[x]=1;
zhan[++top]=x;
for(int i=head[x];i;i=nex[i])
{
int tmp=to[i];
if(!dfn[tmp])
{
tarjan(tmp);
low[x]=min(low[x],low[tmp]);
}
else
{
if(vis[tmp]) low[x]=min(low[x],dfn[tmp]);
}
}
if(low[x]==dfn[x])
{
numc++;
while(zhan[top]!=x)
{
vis[zhan[top]]=0;
col[zhan[top]]=numc;
t[numc]++;
s[numc]=min(numc,zhan[top]);
top--;
}
vis[x]=0;
top--;
col[x]=numc;
t[numc]++;
s[numc]=min(x,s[numc]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
add(x,y);
if(c==2) add(y,x);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
int max1=-1;
int z;
for(int i=1;i<=numc;i++)
{
if(t[i]>max1) max1=t[i],z=i;
}
for(int i=1;i<=numc;i++)
{
if(t[i]==max1&&s[i]<s[z])z=i;
}
printf("%d
",t[z]);
for(int i=1;i<=n;i++)
if(col[i]==z)
printf("%d ",i);
return 0;
}