Описание
Матрица Н * м, начальный вес каждого бункера равен 0, то матрица может выполнять две операции:
- Выберите строку, вес каждой строки значения сетки плюс 1 или минус 1.
- Выберите один, вес столбца каждого значения бен плюс 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 побежал вверх по дороге к неустойке кольца, обратите внимание на начало всех точек в очереди, предотвращая какую-то момент не может быть пройден
Ху чисто рот, потому что нет власти не может платить
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 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-- ) хорошо (); }