40分求助,貌似是链式前向星的head更新出了问题

P4171 [JSOI2010] 满汉全席

bnnnnn @ 2022-12-04 23:23:28

RT

调试时发现链式前向星的head数组不知道为什么被赋上不该出现的值

当输入第20组关系(即tot==39)时,本应添加一条79->144的边,但此时head[190]被赋值成了144,导致后面在运行到144边时进入了死循环。但是单独把错误数据取出调试时不存在问题

也有可能是其它部分的问题,望指出

链式前向星部分代码

struct edg
{
    int to,nxt;
}e[maxm<<1];

void add(int u,int v)
{
    e[++tot].to=v;
    e[tot].nxt=head[u];
    head[u]=tot;
}

出现错误的数据

cin:
1
100 2
h79 h44
h91 m90

//单独取这个样例没问题,但运行整组数据时是在这两个地方出现问题

运行整组数据时
(前后省略)

79 39 39 144
add 79 to 144
    u :79
    v :144
    tot : 39
    e[tot].to : 144
    e[tot].nxt : 39
    head[u] : 39
    head[190] : 144

完整代码(马蜂丑陋见谅)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn=105;
const int maxm=1005;
int n,m,k;
int dfn[maxn<<1],low[maxn<<1],tim;
int scc[maxn<<1],cnt;
int st[maxn<<1],tp,vis[maxn<<1];
int head[maxn],tot;
struct edg
{
    int to,nxt;
}e[maxm<<1];

void add(int u,int v)
{
    e[++tot].to=v;
    e[tot].nxt=head[u];
    /*
    cout<<head[190]<<endl;
    if(tot==39||tot==40||tot==144||tot==143||u==190)
    {
        printf("\n\n\n    %d\n    %d to %d\n    to : %d\n    nxt : %d\n\n\n\n",tot,u,v,e[tot].to,e[tot].nxt);
    }*/
    head[u]=tot;
    /*if(tot==39)
    {
        cout<<endl<<endl<<u<<' '<<head[u]<<' '<<tot<<' '<<head[190]<<endl<<endl;
    }
    */
}

void tarjan(int u)
{
//  printf("  Enter : #%d\n",u);
    dfn[u]=low[u]=++tim;
//  printf("  dfn #%d : %d\n",u,dfn[u]);
    st[++tp]=u; vis[u]=1;
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to;
//      printf("    %d   to : %d   nxt : %d\n",i,e[i].to,e[i].nxt);
//      printf("    %d  #%d to #%d\n",i,u,v);
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(vis[v]) low[u]=min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        cnt++;
//      printf("  SCC :%d\n",cnt); 
        while(st[tp]!=u)
        {
            scc[st[tp]]=cnt;
            vis[st[tp]]=0;
//          printf("    #%d : %d\n",st[tp],cnt);
            tp--;
        }
        scc[st[tp]]=cnt;
        vis[st[tp]]=0;
//      printf("    #%d : %d\n",st[tp],cnt);
        tp--;
    }
}

int main()
{
    scanf("%d",&k);
//  cout<<k<<endl;
    while(k--)
    {
        memset(dfn,0,sizeof(dfn));
        memset(vis,0,sizeof(vis));
        memset(head,0,sizeof(head));
        tim=cnt=tp=tot=0;
        char a,b;
        int x,y;
        bool flag=true;
        scanf("%d%d",&n,&m);
//      cout<<n<<' '<<m<<endl;
        cout<<head[190]<<endl;
        for(int i=1;i<=m;i++)
        {
            cin>>a>>x>>b>>y;
//          printf("#%c%d %c%d\n",a,x,b,y); 
            if(a=='m'&&b=='m')      add(x+n,y),add(y+n,x);
            else if(a=='m'&&b=='h') add(x+n,y+n),add(y,x);
            else if(a=='h'&&b=='m') add(x,y),add(y+n,x+n);
            else if(a=='h'&&b=='h') add(x,y+n),add(y,x+n);
        }
        for(int i=1;i<=(n<<1);i++)
            if(!dfn[i]) tarjan(i);
        for(int i=1;i<=n;i++)
            if(scc[i]==scc[i+n])
            {
                flag=false;
                break;
            }
        if(flag)    printf("GOOD\n");
        else        printf("BAD\n");
    }
    return 0;
}

出现问题的完整数据

1
100 180
h11 m39
m89 h71
h93 m73
m86 m87
m41 h36
m79 m58
h41 m22
m74 m60
m36 h56
m7 h31
m14 m83
h91 m56
m33 h53
m61 m39
m70 m9
m91 m80
m100 m80
h2 h92
m4 m88
h79 h44
m75 h9
m53 m67
h82 h78
m26 h18
m33 h32
m100 h47
m66 h90
m54 h50
h94 m14
m88 h63
m75 m79
m95 m74
m10 m48
h65 m65
m35 h95
m60 h61
h55 m12
h27 m37
m41 m52
m54 h73
m35 m53
h71 m1
h42 h25
m2 h88
m38 h90
m2 m12
h20 h96
h85 h81
m96 m2
h45 h82
m96 h4
m43 h51
h67 m69
m87 m59
m21 h92
h31 h55
h44 h54
m7 h37
h78 h9
h76 m67
h50 m78
h31 h69
h25 m15
m1 h20
m68 m45
m2 m64
h100 h44
m66 m18
h12 m4
h76 h84
m95 h58
h91 m90
m11 m97
h26 m40
m57 h54
m7 m58
h31 m37
m78 h55
h3 h78
h27 m71
h22 m28
h86 h73
m23 h3
m90 h86
m6 h17
m22 h52
h75 h12
h41 m37
m60 h18
h77 h69
h71 m35
h26 h53
h23 h4
m8 h25
h81 h86
m47 h55
m65 m84
m27 h87
m86 h69
m24 h43
h37 h45
h94 m11
h56 h86
m100 m68
m4 h28
h36 m26
m62 h61
m79 m84
h64 h38
m60 h97
m23 h59
m51 h87
m94 h29
m25 m32
h49 h48
m74 h86
h93 h20
m48 h100
h57 m47
h67 m12
m74 m2
h38 h87
m15 m68
h22 m78
h5 m82
h74 m27
m92 m76
m65 m85
m57 h89
h68 h5
h88 h42
h90 m32
h13 m90
m84 h69
m36 h50
m81 h62
m4 m70
m48 h18
m37 m70
m47 m41
m3 m73
h19 h46
h100 m35
m82 h56
m75 h50
h61 h62
h91 m2
m46 h55
h91 m29
h75 m79
m30 h55
m92 m85
h24 m39
m54 m12
h60 m1
h4 m14
h25 h22
m59 m24
m8 m41
m32 h82
m90 m92
h96 h32
h45 m93
h86 h88
m21 m60
h66 h2
m67 h57
m87 m42
m47 h92
h54 m59
m44 h57
h72 m68
h31 m83
h44 m38
m23 m75
m72 h64
m18 h67
h95 m62
h59 m32
h49 m31

非常感谢您的帮助!


by bnnnnn @ 2022-12-04 23:37:07

@RenHangZZH 这里已经有人沦落到连链式前向星都写不对的程度了(((


by CuiZhenhang @ 2022-12-04 23:49:05

head 开小了。

x+n$ 最大为 $2n

by bnnnnn @ 2022-12-08 20:41:04

@CuiZhenhang 非常感谢!就是这个问题


by bnnnnn @ 2022-12-08 20:42:02

错好蠢qwq

——完结——


|