传送门 AtCoder ABC260 F Find 4-cycle
满足条件的四元组可以表示为 ( u , v , w , x ) , u , v ∈ V 1 w , x ∈ V 2 , ( u , w ) , ( u , x ) , ( v , w ) , ( v , x ) ∈ E (u,v,w,x),u,v\in V_1 w,x\in V_2,(u,w),(u,x),(v,w),(v,x)\in E (u,v,w,x),u,v∈V1w,x∈V2,(u,w),(u,x),(v,w),(v,x)∈E,其中 E E E 为边的集合。构造邻接表,枚举规模较大的一侧点集 V 1 V_1 V1,枚举每一对连边的端点,这样的点对数量为 O ( t 2 ) O(t^2) O(t2)。只要其中一对节点满足被枚举到两次,那么就找到了一个满足条件的四元组。根据鸽巢定理,总时间复杂度为 O ( s + t 2 ) O(s+t^2) O(s+t2)
#include
using namespace std;
void solve() {
int s, t, m;
cin >> s >> t >> m;
vector<vector<int>> g(s);
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
u -= 1;
v -= 1 + s;
g[u].push_back(v);
}
vector<vector<int>> mem(t, vector<int>(t, -1));
for (int i = 0; i < s; ++i) {
for (int u : g[i]) {
for (int v : g[i]) {
if (u != v) {
if (mem[u][v] != -1) {
cout << i + 1 << ' ' << mem[u][v] + 1 << ' ' << u + 1 + s << ' ' << v + 1 + s << '\n';
return;
}
mem[u][v] = i;
}
}
}
}
cout << -1 << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}