AtCoder ABC260 F 暴力 + 鸽巢定理

题意

传送门 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,vV1w,xV2,(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;
}

你可能感兴趣的:(数学,算法)