CF-1332 F. Conjunto Independiente

F. Conjunto Independiente

El significado de los problemas

Un árbol de n nodos, cada uno decidido \ (borde inducida ~ subgrafo \ ) el número de series y independiente.

\ (~ Subgrafo \ edge inducida ) significa que el conjunto de bordes para \ (E, (E '\ subset E) \) , \ (E \) en todos los puntos están en el subgrafo.

Observando el resultado deseado en el sujeto, E 'no puede estar vacía

análisis

En primer lugar elegidos subgrafo, los problemas en seleccionados en algún momento en el bosque, no lo hacen cada lado, de modo que el número de punto de ajuste requerido. Para el problema del árbol, el árbol se puede determinar con un DP

Set \ (d [x] [0 ] \) representa el programa número x no está seleccionada, \ (D [x] [. 1] \) representa x el número de programas seleccionados

entonces

\ (D [x] [0] = \ prod (d [y] [1] + d [y] [0]) \\ d [x] [1] = \ prod d [y] [0] \)

Pero esta pregunta no es necesariamente en el X e Y en un árbol, por lo que también considere \ (x \ rightarrow y \) en este lado del estado.

  1. El borde en el subgrafo, el estado del estado x e y se asocia

  2. El subgrafo borde no es, el estado de la Y del estado con x no está asociado

Tenga en cuenta estos dos estados, hay ecuación de transición:

\ (D [x] [0] = \ prod 2 * (d [y] [1] + d [y] [0]) \)

\ (D [x] [1] = \ prod (d [y] [0] + d [y] [1] + d [y] [0]) \)

Aquí parece que el problema ha sido resuelto, pero tener en cuenta que el "punto" no se permite esta situación, debido a que el subtítulo del gráfico se establece por el lado de la estructura, por lo que se considera para deshacerse de esta situación.

Set \ (F [x] \) representa el número de programas no está en las sub-figuras x y secundarios y todos los nodos secundarios están unidos

Con \ (F [y] \) cuando a actualización x, si \ (x \ rightarrow y \) de este borde no está seleccionado, entonces y estado seleccionado \ (d [y] [1 ] \) debe guardar ir \ (F [y] \) , que representa el y no se puede seleccionar como un único punto, se transfiere como sigue:

\ [\ Begin {casos} d [x] [0] = \ prod (d [y] [1] + d [y] [0]) + (d [y] [1] -f [y] + d [y] [0]) \\ d [x] [1] = \ prod (d [y] [0]) + (d [y] [1] - f [y] + d [y] [0] ) \\ f [x] = \ prod (d [y] [1] -f [y] + d [y] [0]) \ end {casos} \]

La respuesta final es \ (D [1] [0] + D [1] [1] -f [1] -1 \) , donde 1 es restado y finalmente de restar el blanco de la figura.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define dbg(x...) do { cout << "\033[32;1m" << #x <<" -> "; err(x); } while (0)
void err() { cout << "\033[39;0m" << endl; }
template<class T, class... Ts> void err(const T& arg,const Ts&... args) { cout << arg << " "; err(args...); }
const int N = 300000 + 5;
const int mod = 998244353;
int head[N], ver[N<<1], nxt[N<<1], tot;
int n;
ll d[N][2], f[N];
void add(int x, int y){
    ver[++tot] = y, nxt[tot] = head[x], head[x] = tot;
}
void dfs(int x, int fa){
    d[x][0] = d[x][1] = f[x] = 1;
    for(int i=head[x];i;i=nxt[i]){
        int y = ver[i];
        if(y == fa) continue;
        dfs(y, x);
        d[x][0] = d[x][0] * ((2 * d[y][0] + 2 * d[y][1] - f[y])%mod) % mod;
        d[x][1] = d[x][1] * ((2 * d[y][0] + d[y][1] - f[y]) % mod) % mod;
        f[x] = f[x] * ((d[y][0] + d[y][1] - f[y]) % mod) % mod;
    }
     dbg(x, d[x][0], d[x][1], f[x]);
}
int main(){
    scanf("%d", &n);
    for(int i=2;i<=n;i++){
        int x, y;
        scanf("%d%d", &x, &y);
        add(x, y);
        add(y, x);
    }
    dfs(1, 0);
    cout << (d[1][0] + d[1][1] - f[1] - 1 + 2 * mod) % mod;
    return 0;
}

Este problema es muy fácil escribir el código, la clave está en encontrar a cabo la transferencia DP, CF explicar el tema muy claro, y la parte posterior de la muestra para explicar, si se coloca en la carrera pueden encontrarse con un agradecido tales Indirecta

Supongo que te gusta

Origin www.cnblogs.com/1625--H/p/12655281.html
Recomendado
Clasificación