Codeforces - 1198C - 独立集合対マッチング - 貪欲

https://codeforces.com/contest/1198/problem/C

n個の一致以上のサイズを選択することは以上N個の独立したセットに等しいサイズを選択します。

マッチングセットに参加し続ける検討、最終的にXエッジを接合。

そう両側に接続できない残りの点で残りの辺との間にポイント追加することができ、またはマッチの数は増加するが、存在しない、これらの点のいずれかの側は、内部に適合するように運命づけられています。

出力との間に、X> = N考えます。

そうでなければ、X <N、少なくとも3N-2Xと残りの点は、これらの全てはまた、から選択され、> = N、マッチング点が外側と点内側一致エッジを有する可能性があるため(移動のために必要とされていなくても、マッチングポイント通信)。

実際に私はあなたに従事することにしたい理由を3 * n個の点を反映している必要がありました。

#include<bits/stdc++.h>
using namespace std;

bool vis[300005];
int eid[500005], etop;

void init(int n, int m) {
    memset(vis, 0, sizeof(vis[0]) * (3*n + 1));
    etop = 0;
}

void update(int i) {
    int u, v;
    scanf("%d%d", &u, &v);
    if(vis[u] || vis[v])
        return;
    else {
        vis[u] = vis[v] = 1;
        eid[++etop] = i;
    }
}

void Matching(int n) {
    puts("Matching");
    for(int i = 1; i <= n; ++i) {
        printf("%d%c", eid[i], " \n"[i == n]);
    }
}

void IndSet(int n) {
    puts("IndSet");
    int cnt = 0;
    for(int i = 1; i <= 3 * n; ++i) {
        if(!vis[i]) {
            ++cnt;
            printf("%d%c", i, " \n"[cnt == n]);
            if(cnt == n)
                return;
        }
    }
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int T;
    scanf("%d", &T);
    int n, m;
    while(T--) {
        scanf("%d%d", &n, &m);
        init(n, m);
        for(int i = 1; i <= m; ++i) {
            update(i);
        }
        if(etop >= n) {
            Matching(n);
        } else {
            IndSet(n);
        }
    }
}

決して前に試合、独立したセットは、適切にそれをしないかとの接触を持っていました。

おすすめ

転載: www.cnblogs.com/Yinku/p/11286332.html