POJ 1733 juego de paridad (campo de extensión disjuntos-set)

enlaces a los temas: Haga clic aquí

Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

Significado de las preguntas:

entrada norte norte representa una longitud norte norte el 0 , 1 0,1 cuerda, metro metro denota Luego metro metro entrada de línea, el siguiente metro metro entrada fila X , y , mi v e n x, y, incluso representa x X a la primera y y el medio de caracteres 1 1 número es un número par; x , y , o d d x, y, impar representa x X a la primera y y el medio de caracteres 1 1 es el número impar. Si el m metro primera frase k + 1 k + 1 es un frente por primera vez con las palabras de la contradicción, la salida k k .

Análisis de las ideas:

x X representa x X es incluso en esta condición, x + n x + n representa x X es una condición extraño que

x , y x, y es el mismo

  1. si x X es impar, y y es un número impar
  2. si x X es par, y y es un número par

x , y x, y es heterogénea

  1. si x X es par, y y es un número impar
  2. si x X es impar, y y es un número par

comprender:

Banda lateral derecho disjuntos-set: x X y y y están relacionados, que están en la misma colección, en cuanto a cuál es la relación depende de la cantidad de peso

campo Extensión de disjuntos-set: la colección siempre que una condición es verdadera, entonces todas las condiciones restantes estableció inevitable.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>

using namespace std;
const int N = 40010, base = N / 2;

int n, m;
int p[N];
map<int,int> mp;

int get(int x)          // 在线离散化
{
    if(mp.count(x) == 0)    mp[x] = ++n;
    return mp[x];
}

int find(int x)
{
    if(x != p[x])   p[x] = find(p[x]);
    return p[x];
}

int main()
{
    scanf("%d%d", &n, &m);
    
    n = 0;      // 用于离散化
    
    for(int i = 1; i < N; ++i)  p[i] = i;   // 初始化
    
    int res = m;
    for(int i = 1; i <= m; ++i)
    {
        int a, b;
        char op[6];
        scanf("%d%d%s", &a, &b, op);
        
        if(res != m)    continue;
        
        a = get(a - 1), b = get(b);
        
        if(op[0] == 'e')                  // 同类
        {
            if(find(a + base) == find(b))  // 有矛盾
            {
                res = i - 1;
                break;					// 数据没有输入完,可以break
            }
            p[find(a)] = find(b);
            p[find(a + base)] = find(b + base);
        }
        else                            // 异类
        {
            if(find(a) == find(b))      // 有矛盾
            {
                res = i - 1;
                break;
            }
            p[find(a)] = find(b + base);
            p[find(a + base)] = find(b);
        }
    }
    
    printf("%d\n", res);
    
    return 0;
}
Publicados 844 artículos originales · ganado elogios 135 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/qq_42815188/article/details/105158828
Recomendado
Clasificación