羅区P2147 [SDOI2008]洞窟の調査

タイトルは、
タイトルは\(LCT \)裸のタイトルが、正の解のタイトルはLCTあり、そして暴力互いに素-セットは、この問題を解決することができます。
問題は必要としないでもパス圧縮ができるように、この問題は、中央のパス踏み台の量を必要としているので。
まずは、接続して破壊する操作を考えてみましょう。
\(接続\)操作:
。Uので、V意志も全体として、FAはそう[U] = FA [V]
\(破壊\)操作:
Uので、vは全体に接続されない、[FAので。V] = 0、すなわち、元の状態に正規化。
\(クエリー\)操作:
操作UまたはV親ノードをスキップし、uは= V内のノードによって取得することができ、またはノードホップの一つまで0
この時、UまたはVは、それらが等しいかどうか判断される。それらは、次いで上側の鎖等しい場合。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define int long long
#define N 4011
using namespace std;
int n, m, fa[401100];
inline int query(int u, int v)
{   
    while (v && u != v) 
    {
        v = fa[v];
        if (v == u)
            return 1;
    }
    if (u == 0) return 1;
    if (v == u) return 1;
    return 0;
}   
inline void connect(int u, int v)
{
    fa[u] = v;
}
inline void destroy(int u, int v) 
{
    fa[v] = 0; 
}
signed main()   
{
    scanf("%lld%lld", &n, &m);
    for (int i = 1; i <= m; i++)
    {       
        string s; int u, v, temp = 0, u1, ha;
        cin >> s;
        scanf("%lld%lld", &u, &v);
        u1 = u;
        while (u1)
        {
            ha = fa[u1];
            fa[u1] = temp; temp = u1; u1 = ha;
        }
        if (s == "Connect")
            connect(u, v);
        if (s == "Destroy")
            destroy(u, v);
        if (s == "Query")
        {
            if (query(u, v))
                printf("Yes\n");
            else
                printf("No\n");
        }
    }       
    return 0;
}

おすすめ

転載: www.cnblogs.com/liuwenyao/p/10993671.html