题解or思路:
首先需要判断成环————》可以用并查集来判断成环
最后DFS遍历一下,记录一下路径,把路径输出就ok了
备注:
因为我们是从小到大开始跑的,所以找到的第一个环,一定是最小环!!!
AC代码:
#include <iostream>
#include <vector>
#include <algorithm>
#define PII pair<int, int>
using namespace std;
const int N = 1e5 + 5;
vector<PII> s[N];
int ui[N], vi[N], fa[N];
int gf(int x)
{
return x == fa[x] ? x : fa[x] = gf(fa[x]);
}
bool dfs(int x, int fff, int end)
{
if (x == end)
return 1;
for (auto it : s[x])
{
int y = it.first;
if (y != fff)
{
bool res = dfs(y, x, end);
if (res)
{
ui[it.second] = 0;
return 1;
}
}
}
return 0;
}
void solve()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++)
scanf("%d %d", &ui[i], &vi[i]);
// init
for (int i = 1; i <= n; i++)
{
fa[i] = i;
s[i].clear();
}
bool flag = 0;
//并查集
for (int i = 1; i <= m; i++)
{
int x = ui[i], y = vi[i];
if (gf(x) == gf(y))
{
ui[i] = 0;
dfs(x, 0, y);
flag = 1;
break;
}
else
{
s[x].push_back({ y,i });
s[y].push_back({ x,i });
fa[gf(x)] = gf(y);
}
}
if (flag)
{
for (int i = 1; i <= m; i++)
{
if (ui[i] == 0)
printf("%d ", i);
}
puts("");
}
else
{
puts("-1");
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
solve();
}
}