问题 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");
}

浙公网安备 33010602011771号