матрица BZOJ4500

Описание

Матрица Н * м, начальный вес каждого бункера равен 0, то матрица может выполнять две операции:

  1. Выберите строку, вес каждой строки значения сетки плюс 1 или минус 1.
  2. Выберите один, вес столбца каждого значения бен плюс 1 или минус 1.
    Есть ограничение К, каждый ограничен триплет (х, у, с), представителем сетка (х, у) равно веса с. Запрашиваемый есть ли последовательность операций, таким образом , что после операции матрицы удовлетворяет все пределы. Если есть выход «Да», в противном случае «Нет».

вход

Первый вход Т (Т <= 5) с Т представляет группу входных данных, каждый из которых Формат данных:
В первой строке три целых числа N, M, K (1 < = п, т, к <= 1000).
Далее к строкам, каждая строка из трех целых чисел х, у, с.

Выход

Для каждого теста, выход Да или Нет

Пример ввода

2

2 2 4

1 1 0

1 2 0

2 1 2

2 2 2

2 2 4

1 1 0

1 2 0

2 1 2

2 2 1

Пример вывода

да

нет

решение проблемы

Указывает операцию с г-го ряда Xi, Yj представляет собой операцию столбца J-й, для (I, J, C) имеют Xi + в Y J = С

с <= X я + Y J <= с -> (- Y J ) + с <= Х я      Х я -c <= (- Y J )

SPFA побежал вверх по дороге к неустойке кольца, обратите внимание на начало всех точек в очереди, предотвращая какую-то момент не может быть пройден

Ху чисто рот, потому что нет власти не может платить

# include <бит / STDC ++ ч.>
 с использованием  пространства имен STD; 

Const  INT maxn = 2005 ;
INT т, п, т, к;
INT CNT, глава [maxn], сх [maxn];
структура края {
     INT у, вал, затем; 
} е [maxn << 1 ]; 

недействительными добавить ( INT х, INT у, INT г) { 
    е [ ++ CNT] = (край) {Y, Z, глава [х]}; 
    Голова [х] = CNT; 
} 

INT Dis [maxn]; 
Очередь < INT > д;
BOOL отношению [maxn];

BOOL SPFA () {
     в то время как (! q.pop () q.empty ());
    для ( INT I = 1 ; I <= п + т; я ++) q.push (я), дис [I] = 0 , Cx [I] = 1 , по отношению [I] = истинным ;
    в то время как (! {q.empty ())
         INT х = q.front (); 
        q.pop (); 
        по отношению [х] = ложь ;
        если (сх [х]> = п + т) вернуться  верно ;
        для ( INT I = головы [х]; I; I = е [I] .next) {
             INT у = е [я] .y, Val = е [я] .val;
            если (дис [у] <дис [х] + вал) { 
                дис [у] = дис [X] + Val;
                если (! {визави [у]) 
                    q.push (у) по отношению [у] = истинный ;
                    если (++ ой [у]> = п + т) вернуться  верно ; 
                } 
            } 
        } 
    } 
    Вернуться  ложным ; 
} 

Пустота хорошо () { 
    CNT = 0 ; 
    MemSet (голова, 0 , SizeOf (головка)); 
    зсапЕ ( " % d% d% d ", & п, & м, & к);
    для ( INT I = 1 ; г <= к; я ++ ) {
         INT х, у, г; 
        зсапЕ ( " % d% d% d " , & х, & у, & г);
        // г <= х + у <= г
         // г <= х - (- у) <= г
         // (у) + г <= х XZ <= (- у) 
        добавить (у + п, х , г), добавить (х, у + п, - г); 
    } 
    Е ( " % s \ п " , SPFA ()? " Нет " : " Да " );

% d " , & т);
     в то время как (T-- ) хорошо (); 
}
Просмотр кода

 

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

отwww.cnblogs.com/sto324/p/11208875.html