Luogu P1726 上白泽慧音
tarjan强联通裸题,可以当模板用
记录一下自己容易错或忘的几个地方(注释)
#include<cstdio>
#include<cstring>
int n,m,sum=0,top=0,maxx,len,a[50010],tot;
struct nod1{int x,y,next;}b[100010];
int first[100100],z[100100],dfn[100100],qlt[100100],sy[100100],low[100100];
int minn(int x,int y)
{
return x<y?x:y;
}
int ins(int x,int y)
{
len++;
b[len].x=x;
b[len].y=y;
b[len].next=first[x];
first[x]=len;
}
int tarjan(int x)
{
tot++;
dfn[x]=low[x]=tot;
top++;//top是栈内元素的个数
z[top]=x;
a[x]=1;
//分清top和tot
for(int i=first[x];i;i=b[i].next)
{
int y=b[i].y;
if(dfn[y]==0)
{
tarjan(y);
low[x]=minn(low[x],low[y]);
//这里取minn的是low[x]和low[y]
}
else
{
if(a[y]==1)
low[x]=minn(low[x],dfn[y]);
//这里是low[x]和dfn[y]
}
}
if(dfn[x]==low[x])
{
int y;
sum++;
do
{
y=z[top];
top--;
a[y]=0;
sy[y]=sum;
qlt[sum]++;
}while(x!=y);
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,t;
scanf("%d %d %d",&x,&y,&t);
if(t==1)ins(x,y);
if(t==2)ins(x,y),ins(y,x);
}
for(int i=1;i<=n;i++)
{
if(dfn[i]==0)tarjan(i);
}
for(int i=1;i<=sum;i++)
{
if(qlt[i]>maxx)maxx=i;
}
printf("%d\n",qlt[maxx]);
for(int i=1;i<=n;i++)
{
if(sy[i]==maxx)
printf("%d ",i);
}
}