洛谷WA+MLE,本地Linux样例段错误
查看原帖
洛谷WA+MLE,本地Linux样例段错误
142549
hbhz_zcy楼主2020/10/10 15:34

本地:最终发现样例数据在一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;
}
2020/10/10 15:34
加载中...