题目地址
解题思路
通过并查集判断出图的环,然后dfs查找到它所在环的路径,得到顶点数组,进行一次排序输出。虽然题目没说,但我觉得应该就是一个环,这样就能保证把环里的顶点全都不重复的放到数组里了。因此dfs放在循环里和循环外都行,memset写不写也都行。
AC代码
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
vector <int >G[100010];
vector <int> num;
int vis[100010], f[100010];
bool dfs(int v, int location)
{
if (vis[v])
{
if (v == location)
return true;
return false;
}
else
{
vis[v] = 1;
for (int i=0; i<G[v].size(); i++)
{
if (dfs(G[v][i], location))
{
num.push_back(G[v][i]);
return true;
}
}
}
return false;
}
void init()
{
for (int i=1; i<100009; i++)
f[i] = i;
}
int find(int x)
{
int root = x;
while (root != f[root])
root = f[root];
while (x != root)
{
int t = f[x];
f[x] = root;
x = t;
}
return root;
}
int main()
{
int n;
init();
cin >> n;
for (int i=0; i<n; i++)
{
int x, y;
cin >> x >> y;
G[x].push_back(y);
G[y].push_back(x);
int tx = find(x);
int ty = find(y);
if (tx != ty)
{
f[tx] = ty;
}
else
{
// memset(vis, 0, sizeof(vis));
dfs(x, x);
}
}
sort(num.begin(), num.end());
for (int i=0; i<num.size(); i++)
{
cout << num[i] << " ";
}
cout << endl;
return 0;
}