本地:最终发现样例数据在一Tarjan中未进入直接报错
code
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=1000010;
struct Node{
int from,to,next;
}e[maxn*2];
int head[maxn],num=0;
int dfn[maxn],low[maxn],Tim=0;
int stac[maxn],top=0;
int ans=0,Ans[maxn];
void edged(int from,int to){
e[++num].to=to;
e[num].from=from;
e[num].next=head[from];
head[from]=num;
}
void Tarjan(int fa,int u){
dfn[u]=low[u]=++Tim;
stac[++top]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!dfn[v]){
Tarjan(u,v);
low[u]=min(low[u],low[v]);
}
else if(v!=fa) low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int sum=0,Sum[maxn]={};
while(stac[top+1]!=u){
top--;
Sum[++sum]=stac[top];
Sum[0]=min(Sum[0],stac[top]);//record min
}
if(ans<sum||(ans==sum&&Ans[0]>Sum[0])){
ans=sum;
for(int i=0;i<=sum;i++) Ans[i]=Sum[i];
}
}
return;
}
int main(){
int N,M;
scanf("%d%d",&N,&M);
for(int i=1;i<=M;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
edged(a,b);
if(c==2) edged(b,a);
}
for(int i=1;i<=N;i++)
if(!dfn[i]) Tarjan(0,i);
printf("%d\n",ans);
for(int i=1;i<=ans;i++) printf("%d ",Ans[i]);
return 0;
}