题意 :
- 给一个 无向 二分图,求图中任意一个四元环
题解 :
- 我们发现O(T^2)是可行的;四元环就是同一个集合中两个元素,当它们两个元素有两个共同的在另一个集合中的边时,这四个元素就组成了一个四元环
- 因此,我们可以以大的集合为第一重循环,然后枚举它的所有连边的另一个点的双重循环,这样时O(T^2),初始化f数组为-1,如果第二次有公共点,就可以输出
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 3e5 + 10, M = 3e3 + 10;
int s, t, m;
vector<int> G[N];
int f[M][M];
int main() {
cin >> s >> t >> m;
for (int i = 0, u, v; i < m; ++ i) {
cin >> u >> v;
G[u].push_back(v - s);
}
memset(f, -1, sizeof f);
for (int i = 1; i <= s; ++ i) {
for (auto &u: G[i]) {
for (auto &v: G[i]) {
if (u == v) continue;
if (f[u][v] != -1) {
cout << i << ' ' << f[u][v] << ' ' << u + s << ' ' << v + s;
return 0;
}
f[u][v] = i;
}
}
}
cout << -1;
}