POJ 3041 астероиды (максимальный двудольный граф соответствия)

### тема Link ###

С учетом эффекта:

И дать вам N K, есть K астероид на N * N точек на дюйм. Существует разрез может быть разрезан в сторону или вертикально оружия, и спросил, сколько раз минимальный разрез, все планеты будут уничтожены.

 

Анализ:

1 ~ п число строк добавлено влево набор, количество N 1, чтобы присоединиться правильный набор столбцов. Все точки затем даются как ненаправленные ребра, подключены к двудольному графу.

1, для каждой стороны, до тех пор, как один из концов выбрано, сторона статьи планетарной представлены может быть уничтожена. Точно так же, если вы выберите эту конечную точку, все подключения к этой конечной точке, когда все планеты будут уничтожены.

2, для образцов, предполагая выбран I (набор слева) --- 1 (правильный набор) этот край, то я выбрал первый столбец или первый ряд вертикально вырезать сбоку разреза. Таким образом, устраняются и 1 (левый набор) все подключенные ребра представляют собой астероид, для 1 (правого набора) эмпатии.

Установлено, что: две концевых точек А и В, соответствующем выбранном ребро, то потребность не может быть связан с другой стороны, о других выбранных сторонах B и A и B не должна быть выбрана.

Таким образом, суть этой проблемы заключается в том, что ряд вопросов, охватываемая точкой минимума.

Минимальная проблема покрытия: найти минимальное количество очков, поэтому этот показатель может иметь все стороны были выбрана по меньшей мере , одну конечной точки. Это означает , что выбранная точка, эта точка , как концевые края будет перезаписана.

Тогда двудольный граф эквивалентно наименьшего охвата двудольный граф максимального соответствия. 

#include <iostream> 
#include <алгоритм> 
#include < строка .h>
 #define maxn 1008
 с использованием  пространства имен STD;
Int п, т, е, CNT;
ИНТ головы [maxn];
INT сх [maxn], су [maxn];
BOOL отношению [maxn];
структура края 
{ 
    INT к;
    ИНТ рядом; 
} край [maxn * maxn]; 
рядный недействительными добавить ( INT и, INT v) 
{ 
    край [ ++ CNT] .to = v; 
    Край [CNT] .next =голова [и]; 
    голова [и] = CNT;
    вернуться ; 
} 
Инлайн INT ДФС ( INT и) 
{ 
    для ( INT I = напор [и]; я; я = ребро [I] .next) {
         INT v = ребро [I] .to;
        если (! {визави [v]) по 
            отношению [v] = истинный ;
            если (су [v] == 0 || ДФС (су [v])) { 
                сх [и] = v; 
                су [v] = U;
                вернуться  1 ; 
            }
        } 
    } 
    Возвращают  0 ; 
} 
INT основных () 
{ 
    // = freopen ( "TestData (7) .в", "г", STDIN); 
    зсапЕ ( " % d% d " , & п, & м);
    INT A, B;
    для ( INT I = 1 ; я <= т; я ++) {зсапЕ ( " % d% d " , & А, & B), добавьте (А, В);}
     INT ANS = 0 ;
    для ( INT I = 1 , г <= п, я ++ ) {
         если (! сх [я]) {MemSet (визави, 0 ,(Ам)); лет + =ДФС (я);} 
    } 
    Е ( " % d \ п " , ANS); 
}

 

рекомендация

отwww.cnblogs.com/Absofuckinglutely/p/11365265.html