1 条题解

  • 0
    @ 2025-5-8 20:15:50

    题解

    DFS遍历,vis数组标记已遍历的边。 DFS的思想等效于先找一个环,然后对环上所有点递归DFS,并且把这些递归

    产生的路插入这个环中。最重要的地方是在哪里保存路径。因为DFS函数的结

    束顺序就是点的回溯顺序,所以应该在DFS回溯完之后再记录当前点的序号,

    也就是now的值。

    代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int MAXN = 10010;
    const int MAXM = 100010;
     
    int head[MAXN],N,M;
    struct EdgeNode
    {
        int to;
        int w;
        int next;
    };
     
    EdgeNode Edges[MAXM];
     
    int ans[MAXM],ansi;
    bool vis[MAXM];
    void DFS(int now)
    {
        int k;
        for(k = head[now]; k != -1; k = Edges[k].next)
        {
            if(!vis[k])
            {
                vis[k] = true;
                DFS(Edges[k].to);
            }
        }
        ans[ansi++] = now;
    }
     
    int main()
    {
        while(cin >> N >> M)
        {
            int x,y;
            memset(Edges,0,sizeof(Edges));
            memset(head,-1,sizeof(head));
            memset(ans,0,sizeof(ans));
            memset(vis,0,sizeof(vis));
            int j = 0;
            for(int i = 0; i < M; ++i)
            {
                cin >> x >> y;
                Edges[j].to = y;
                Edges[j].w = 1;
                Edges[j].next = head[x];
                head[x] = j;
                j++;
                Edges[j].to = x;
                Edges[j].w = 1;
                Edges[j].next = head[y];
                head[y] = j;
                j++;
            }
            ansi = 0;
            DFS(1);
            for(int i = 0; i < ansi; ++i)
                cout << ans[i] << endl;
        }
     
        return 0;
    }
    
    • 1

    信息

    ID
    1231
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者