我想问一下两段代码有何不同
#include<stdio.h>
#include<algorithm>
using namespace std;
int dfn[500000],low[500000],stack[900000],j,number,n,m,x,y,w,hh[600000],i,cnt,top,c,q,ans,yy[100000];
int color[400000],u,num,p[400000];
bool d[500000];
struct node
{
int next,z,e;
}b[110000];
void add(int aa,int bb)
{
b[++cnt].e=bb;
b[cnt].next=hh[aa];
hh[aa]=cnt;
}
int tarjan(int k)
{
dfn[k]=low[k]=++number;
stack[++top]=k;
d[k]=true;
for(i=hh[k];i!=0;i=b[i].next)
{
if(!dfn[b[i].e]){
tarjan(b[i].e);
low[k]=min(low[k],low[b[i].e]);
}
else if(d[b[i].e]==true)
{
low[k]=min(low[k],dfn[b[i].e]);
}
}
if(dfn[k]==low[k])
{
color[k]=++num;
d[k]=false;
p[num]++;
while(stack[top]!=k)
{
p[num]++;
color[stack[top]]=num;
d[stack[top--]]=false;
}
top--;
}
return 0;
}
int main()
{
scanf("%d %d",&n,&m);
u=1;
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&w);
if(w==1)add(x,y);
else{
add(x,y);add(y,x);
}
}
for(j=1;j<=n;j++)
{
if(!dfn[j])tarjan(j);
}
for(i=1;i<=n;i++)
{
if(p[color[i]]>ans)ans=p[color[i]],u=i;
}
printf("%d\n",ans);
for(i=1;i<=n;i++)
{
if(color[i]==color[u])printf("%d ",i);
}
return 0;
}
以上是ac代码
但我原本tarjan里写的是
if(dfn[k]==low[k])
{
color[k]=++num;
while(1)
{
p[num]++;
d[top]=false;
color[stack[top--]]=num;
if(stack[top+1]==k)break;
}
}
十个点全错了,求解释两段代码难道有什么不一样吗,没看出来