问题 F: Hamiltonish Path(DFS)

题目链接
actcode上的题.

题意:

给一个无向图,要求找出一条路符合以下要求:起始点的相邻点都要包含在路径中,同一个点只能经过一次。

思路:

我们看出要求让我们找到一个起点开始的最长路径,那么我们就可以找到一个点然后可以直接让他往两端扩,看能扩多远,这样我们就把方向定了,那么我们就需要用双端队列来维护,因为我们两个端点都需要用,不让看一个3e5也行,标记左端点右端点.原理是一样的.

void dfs(ll x, ll flag)
{
    for(int i = 0; i < v[x].size(); i++)
    {
        if(vis[v[x][i]] == 0)
        {
            if(flag) q.push_front(v[x][i]);///往前扩
            else q.push_back(v[x][i]);///往后扩
            vis[v[x][i]] = 1; ///标记
            dfs(v[x][i], flag);
            return ;
        }
    }
}

void solve()
{
    scanf("%lld%lld", &n, &m);
    for(int i = 1; i <= m; i++)
    {
        ll x, y;
        scanf("%lld%lld", &x, &y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    q.push_back(1);
    q.push_back(v[1][0]);
    vis[1] = vis[v[1][0]] = 1;
    dfs(1, 1);
    dfs(v[1][0], 0);
    ll len=q.size();
    printf("%lld\n",len);
    for(auto it = q.begin(); it != q.end(); ++it)
        printf("%lld ", *it);
    printf("\n");
}
posted @ 2021-06-02 20:33  `KingZhang`  阅读(45)  评论(0)    收藏  举报