标签:
2 4 3 1 3 5 1 1 4 2 3 7 3 5 9 2 2 2 1 3 1 2 2
Case 1: Yes Case 2: Yes
218ms
#include <stdio.h> #include <string.h> #define maxn 1200 #define maxm 700000 #define inf 0x3f3f3f3f int head[maxn], n, m, id; // n machines struct Node { int u, v, c, next; } E[maxm]; int source, sink, tar, maxDay, nv; int que[maxn], Layer[maxn], pre[maxn]; bool vis[maxn]; void addEdge(int u, int v, int c) { E[id].u = u; E[id].v = v; E[id].c = c; E[id].next = head[u]; head[u] = id++; E[id].u = v; E[id].v = u; E[id].c = 0; E[id].next = head[v]; head[v] = id++; } void getMap() { int i, j, u, v, p, s, e; id = tar = maxDay = 0; scanf("%d%d", &m, &n); memset(head, -1, sizeof(head)); source = 0; sink = 705; for(i = 1; i <= m; ++i) { scanf("%d%d%d", &p, &s, &e); tar += p; if(e > maxDay) maxDay = e; addEdge(source, i, p); for(j = s; j <= e; ++j) addEdge(i, m + j, 1); } sink = m + maxDay + 1; nv = sink + 1; for(i = 1; i <= maxDay; ++i) addEdge(m + i, sink, n); } bool countLayer() { memset(Layer, 0, sizeof(int) * nv); int id = 0, front = 0, u, v, i; Layer[source] = 1; que[id++] = source; while(front != id) { u = que[front++]; for(i = head[u]; i != -1; i = E[i].next) { v = E[i].v; if(E[i].c && !Layer[v]) { Layer[v] = Layer[u] + 1; if(v == sink) return true; else que[id++] = v; } } } return false; } int Dinic() { int i, u, v, minCut, maxFlow = 0, pos, id = 0; while(countLayer()) { memset(vis, 0, sizeof(bool) * nv); memset(pre, -1, sizeof(int) * nv); que[id++] = source; vis[source] = 1; while(id) { u = que[id - 1]; if(u == sink) { minCut = inf; for(i = pre[sink]; i != -1; i = pre[E[i].u]) if(minCut > E[i].c) { minCut = E[i].c; pos = E[i].u; } maxFlow += minCut; for(i = pre[sink]; i != -1; i = pre[E[i].u]) { E[i].c -= minCut; E[i^1].c += minCut; } while(que[id-1] != pos) vis[que[--id]] = 0; } else { for(i = head[u]; i != -1; i = E[i].next) if(E[i].c && Layer[u] + 1 == Layer[v = E[i].v] && !vis[v]) { vis[v] = 1; que[id++] = v; pre[v] = i; break; } if(i == -1) --id; } } } return maxFlow; } void solve(int cas) { printf("Case %d: %s\n\n", cas, tar == Dinic() ? "Yes" : "No"); } int main() { // freopen("stdin.txt", "r", stdin); int t, cas; scanf("%d", &t); for(cas = 1; cas <= t; ++cas) { getMap(); solve(cas); } return 0; }
62ms
#include <stdio.h> #include <string.h> #define maxn 1200 #define maxm 700000 int head[maxn], n, m, id; // n machines struct Node { int u, v, c, next; } E[maxm]; int source, sink, tar, maxDay, nv; const int inf = 0x3f3f3f3f; int cur[maxn], ps[maxn], dep[maxn]; void addEdge(int u, int v, int c) { E[id].u = u; E[id].v = v; E[id].c = c; E[id].next = head[u]; head[u] = id++; E[id].u = v; E[id].v = u; E[id].c = 0; E[id].next = head[v]; head[v] = id++; } void getMap() { int i, j, u, v, p, s, e; id = tar = maxDay = 0; scanf("%d%d", &m, &n); memset(head, -1, sizeof(head)); source = 0; for(i = 1; i <= m; ++i) { scanf("%d%d%d", &p, &s, &e); tar += p; if(e > maxDay) maxDay = e; addEdge(source, i, p); for(j = s; j <= e; ++j) addEdge(i, m + j, 1); } sink = m + maxDay + 1; nv = sink + 1; for(i = 1; i <= maxDay; ++i) addEdge(m + i, sink, n); } // 參数:顶点个数。源点,汇点 int Dinic(int n, int s, int t) { int tr, res = 0; int i, j, k, f, r, top; while(true) { memset(dep, -1, n * sizeof(int)); for(f = dep[ps[0] = s] = 0, r = 1; f != r; ) for(i = ps[f++], j = head[i]; j != -1; j = E[j].next) { if(E[j].c && -1 == dep[k=E[j].v]) { dep[k] = dep[i] + 1; ps[r++] = k; if(k == t) { f = r; break; } } } if(-1 == dep[t]) break; memcpy(cur, head, n * sizeof(int)); for(i = s, top = 0; ; ) { if(i == t) { for(k = 0, tr = inf; k < top; ++k) if(E[ps[k]].c < tr) tr = E[ps[f=k]].c; for(k = 0; k < top; ++k) E[ps[k]].c -= tr, E[ps[k]^1].c += tr; res += tr; i = E[ps[top = f]].u; } for(j = cur[i]; cur[i] != -1; j = cur[i] = E[cur[i]].next) if(E[j].c && dep[i] + 1 == dep[E[j].v]) break; if(cur[i] != -1) { ps[top++] = cur[i]; i = E[cur[i]].v; } else { if(0 == top) break; dep[i] = -1; i = E[ps[--top]].u; } } } return res; } void solve(int cas) { printf("Case %d: %s\n\n", cas, tar == Dinic(nv, source, sink) ?"Yes" : "No"); } int main() { // freopen("stdin.txt", "r", stdin); int t, cas; scanf("%d", &t); for(cas = 1; cas <= t; ++cas) { getMap(); solve(cas); } return 0; }
标签:
原文地址:http://www.cnblogs.com/lcchuguo/p/5354849.html