#include <cstdio> #include <algorithm> #include <vector> #include <set> #include <unordered_map> #include <queue> #define pb push_back #define sz size() using namespace std; typedef vector<int> vi; struct zadanie { int p, k, c; }; int flow(vector<vi>& G) { const int end = G.sz-1; int f = 0; while(true) { vi parent(G.sz, -1); queue<int> kju; kju.push(0); parent[0] = 0; while(kju.sz && parent[end] == -1) { int a = kju.front(); kju.pop(); for(int b=0; b<G[a].sz; ++b) { if(parent[b] == -1 && G[a][b] > 0) { parent[b] = a; kju.push(b); } } } if(parent[end] == -1) return f; int f1 = G[parent[end]][end]; for(int a=end; parent[a] != a; a=parent[a]) f1 = min(f1, G[parent[a]][a]); for(int a=end; parent[a] != a; a=parent[a]) { G[parent[a]][a] -= f1; G[a][parent[a]] += f1; // printf(". %d->%d\t%d\n", parent[a], a, G[parent[a]][a]); // printf(". %d->%d\t%d\n", a, parent[a], G[a][parent[a]]); } f += f1; } } int main() { int n, m; scanf("%d%d", &n, &m); vector<zadanie> zad(n+1); set<int> ts; int sumc = 0; for(int i=1; i<=n; ++i) { scanf("%d%d%d", &zad[i].p, &zad[i].k, &zad[i].c); ts.insert(zad[i].p); ts.insert(zad[i].k); sumc += zad[i].c; } vi konce(ts.begin(), ts.end()); unordered_map<int,int> mk; for(int i=0; i<konce.sz; ++i) { mk[konce[i]] = i; //printf("%d -> %d\n", konce[i], i); } int b = konce.sz; vector<vi> G(1+n+b, vi(1+n+b, 0)); for(int i=1; i<=n; ++i) { G[0][i] = zad[i].c; for(int j=mk[zad[i].p]; j+1<konce.sz && konce[j]<zad[i].k; ++j) { G[i][n+1+j] = konce[j+1] - konce[j]; } } for(int j=0; j+1<konce.sz; ++j) G[n+1+j][n+b] = m*(konce[j+1] - konce[j]); // for(int a=0; a<G.sz; ++a) // for(int b=0; b<G[a].sz; ++b) // if(G[a][b]) // printf("%d->%d:\t%d\n", a, b, G[a][b]); puts(flow(G) == sumc ? "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 | #include <cstdio> #include <algorithm> #include <vector> #include <set> #include <unordered_map> #include <queue> #define pb push_back #define sz size() using namespace std; typedef vector<int> vi; struct zadanie { int p, k, c; }; int flow(vector<vi>& G) { const int end = G.sz-1; int f = 0; while(true) { vi parent(G.sz, -1); queue<int> kju; kju.push(0); parent[0] = 0; while(kju.sz && parent[end] == -1) { int a = kju.front(); kju.pop(); for(int b=0; b<G[a].sz; ++b) { if(parent[b] == -1 && G[a][b] > 0) { parent[b] = a; kju.push(b); } } } if(parent[end] == -1) return f; int f1 = G[parent[end]][end]; for(int a=end; parent[a] != a; a=parent[a]) f1 = min(f1, G[parent[a]][a]); for(int a=end; parent[a] != a; a=parent[a]) { G[parent[a]][a] -= f1; G[a][parent[a]] += f1; // printf(". %d->%d\t%d\n", parent[a], a, G[parent[a]][a]); // printf(". %d->%d\t%d\n", a, parent[a], G[a][parent[a]]); } f += f1; } } int main() { int n, m; scanf("%d%d", &n, &m); vector<zadanie> zad(n+1); set<int> ts; int sumc = 0; for(int i=1; i<=n; ++i) { scanf("%d%d%d", &zad[i].p, &zad[i].k, &zad[i].c); ts.insert(zad[i].p); ts.insert(zad[i].k); sumc += zad[i].c; } vi konce(ts.begin(), ts.end()); unordered_map<int,int> mk; for(int i=0; i<konce.sz; ++i) { mk[konce[i]] = i; //printf("%d -> %d\n", konce[i], i); } int b = konce.sz; vector<vi> G(1+n+b, vi(1+n+b, 0)); for(int i=1; i<=n; ++i) { G[0][i] = zad[i].c; for(int j=mk[zad[i].p]; j+1<konce.sz && konce[j]<zad[i].k; ++j) { G[i][n+1+j] = konce[j+1] - konce[j]; } } for(int j=0; j+1<konce.sz; ++j) G[n+1+j][n+b] = m*(konce[j+1] - konce[j]); // for(int a=0; a<G.sz; ++a) // for(int b=0; b<G[a].sz; ++b) // if(G[a][b]) // printf("%d->%d:\t%d\n", a, b, G[a][b]); puts(flow(G) == sumc ? "TAK" : "NIE"); } |