#include <bits/stdc++.h>
using namespace std;
const int N = 405;
// const int M = 30;
int beg[N], koniec[N], dur[N];
const long long int inf = 1LL<<60;
long long int f[2*N][2*N], wynik;
long long int target;
int v_size, lay[2*N], wsk[2*N];
queue<int> kol;
bool BFS()
{
int v;
kol.push(0);
lay[0]=1;
for (int i=1;i<=v_size;i++) lay[i]=0;
for (int i=0;i<=v_size;i++) wsk[i]=0;
while( kol.empty()==0 )
{
v = kol.front();
kol.pop();
for (int i=0;i<=v_size;i++)
if ( lay[i]==0 && f[v][i]>0 )
{
lay[i] = lay[v]+1;
kol.push(i);
}
}
if (lay[v_size]==0) return 0;
return 1;
}
long long int dfs(int a,long long int d)
{
long long x=0,y;
if (a==v_size)
{
wynik+=d;
return d;
}
for (;d&&wsk[a]<=v_size;wsk[a]++)
if (lay[ wsk[a] ] == lay[a]+1)
{
y = dfs( wsk[a], min(d, f[a][ wsk[a] ] ) );
d-=y;
x+=y;
f[a][ wsk[a] ] -=y;
f[ wsk[a] ][a] +=y;
}
return x;
}
void dinic()
{
while( BFS() ) dfs(0,inf);
}
void init(int n,int m) {
vector<int> ska;
for (int i = 1; i <= n; i ++) {
ska.push_back(beg[i]);
ska.push_back(koniec[i]);
target += dur[i];
}
ska.push_back(1000 * 1000);
ska.push_back(1000 * 1000 + 1);
sort(ska.begin(), ska.end());
ska.resize(unique(ska.begin(), ska.end()) - ska.begin());
v_size = n + ska.size() + 1;
for (int i = 1; i <= n; i ++) {
//krawędzie odpowiadające za możność zajęcia danego przedziału
for (int j = 0; j < ska.size() - 1; j ++) {
if (beg[i] <= ska[j] && ska[j] < koniec[i]) {
f[i][n + j + 1] = ska[j + 1] - ska[j];
}
}
//krawędzie odpowiadające za konieczność wykonanaia dur[i] zadań
f[0][i] = dur[i];
}
//krawędzie z wątków do końca
for (int i = 0; i < ska.size() - 1; i++) {
f[n + i + 1][v_size] = m *(ska[i + 1] - ska[i]);
}
}
bool da_sie(int n,int m) {
dinic();
return target == wynik;
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++) {
scanf("%d", beg + i);
scanf("%d", koniec + i);
scanf("%d", dur + i);
}
init(n, m);
bool result = da_sie(n, m);
printf(result ? "TAK" : "NIE");
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <bits/stdc++.h> using namespace std; const int N = 405; // const int M = 30; int beg[N], koniec[N], dur[N]; const long long int inf = 1LL<<60; long long int f[2*N][2*N], wynik; long long int target; int v_size, lay[2*N], wsk[2*N]; queue<int> kol; bool BFS() { int v; kol.push(0); lay[0]=1; for (int i=1;i<=v_size;i++) lay[i]=0; for (int i=0;i<=v_size;i++) wsk[i]=0; while( kol.empty()==0 ) { v = kol.front(); kol.pop(); for (int i=0;i<=v_size;i++) if ( lay[i]==0 && f[v][i]>0 ) { lay[i] = lay[v]+1; kol.push(i); } } if (lay[v_size]==0) return 0; return 1; } long long int dfs(int a,long long int d) { long long x=0,y; if (a==v_size) { wynik+=d; return d; } for (;d&&wsk[a]<=v_size;wsk[a]++) if (lay[ wsk[a] ] == lay[a]+1) { y = dfs( wsk[a], min(d, f[a][ wsk[a] ] ) ); d-=y; x+=y; f[a][ wsk[a] ] -=y; f[ wsk[a] ][a] +=y; } return x; } void dinic() { while( BFS() ) dfs(0,inf); } void init(int n,int m) { vector<int> ska; for (int i = 1; i <= n; i ++) { ska.push_back(beg[i]); ska.push_back(koniec[i]); target += dur[i]; } ska.push_back(1000 * 1000); ska.push_back(1000 * 1000 + 1); sort(ska.begin(), ska.end()); ska.resize(unique(ska.begin(), ska.end()) - ska.begin()); v_size = n + ska.size() + 1; for (int i = 1; i <= n; i ++) { //krawędzie odpowiadające za możność zajęcia danego przedziału for (int j = 0; j < ska.size() - 1; j ++) { if (beg[i] <= ska[j] && ska[j] < koniec[i]) { f[i][n + j + 1] = ska[j + 1] - ska[j]; } } //krawędzie odpowiadające za konieczność wykonanaia dur[i] zadań f[0][i] = dur[i]; } //krawędzie z wątków do końca for (int i = 0; i < ska.size() - 1; i++) { f[n + i + 1][v_size] = m *(ska[i + 1] - ska[i]); } } bool da_sie(int n,int m) { dinic(); return target == wynik; } int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i ++) { scanf("%d", beg + i); scanf("%d", koniec + i); scanf("%d", dur + i); } init(n, m); bool result = da_sie(n, m); printf(result ? "TAK" : "NIE"); } |
English