Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:明明有10000K空间的啊,我怎么会爆空间呢?In Reply To:明明有10000K空间的啊,我怎么会爆空间呢? Posted by:histar64 at 2016-02-28 09:14:10 > 我开的各种数组自己测试的时候只有700k,而且队列后来也换成了手写的,不明白为什么会爆空间 > 代码如下: > > #include <cstdio> > > #define REP(i, s, t) for (int i = (s); i <= (t); i++) > > const int INF = (int)2e9; > const int N = (int)2e2 + 50; > const int M = (int)3e4 + 50; > const int S = (int)1e3 + 50; > > inline int min(int a, int b) > { > return a < b ? a : b; > } > > int head[N], cnt = 1; > struct edge {int to, next, v;} e[M]; > inline void ins(int x, int y, int v) > { > e[++cnt] = (edge){y, head[x], v}; head[x] = cnt; > e[++cnt] = (edge){x, head[y], 0}; head[y] = cnt; > } > > int q[N], sq, tq; > int n, s, lev[N], cur[N]; > bool bfs() > { > REP(i, 1, n) > lev[i] = -1; > lev[1] = 0; > sq = tq = 1; > q[tq++] = 1; > while (sq != tq) { > int x = q[sq++]; > for (int i = head[x]; i; i = e[i].next) { > if (e[i].v && lev[e[i].to] == -1) { > lev[e[i].to] = lev[x] + 1; > q[tq++] = e[i].to; > } > } > } > return lev[n] != -1; > } > > bool vst[N][N]; > int dfs(int x, int lim) > { > if (x == n) > return lim; > int usd = 0; > for (int i = cur[x]; i; i = e[i].next) { > int tmp = dfs(e[i].to, min(e[i].v, lim - usd)); > e[i].v -= tmp; > if (e[i].v) > cur[x] = i; > e[i^1].v += tmp; > usd += tmp; > if (usd == lim) > return lim; > } > if (!usd) > lev[x] = -1; > return usd; > } > > int dinic() > { > int maxflow = 0; > while (bfs()) { > REP(i, 1, n) { > cur[i] = head[i]; > } > maxflow += dfs(1, INF); > } > return maxflow; > } > > int d[S], p[S]; > void input() > { > scanf("%d%d", &s, &n); > REP(i, 1, s) > scanf("%d", &d[i]); > REP(i, 1, n) { > int a, k, v = 0; > scanf("%d", &k); > REP(j, 1, k) { > scanf("%d", &a); > if (p[a] == 0) { > v += d[a]; > p[a] = i; > } else { > if (!vst[p[a]][i]) { > ins(p[a] + 1, i + 1, INF); > vst[p[a]][i] = vst[i][p[a]] = 1; > } > p[a] = i; //关键,且不能放到里面 > } > } > if (v) > ins(1, i + 1, v); > scanf("%d", &v); > ins(i + 1, n + 2, v); > } > n += 2; > } > > void go() > { > int ans = dinic(); > printf("%d\n", ans); > } > > int main() > { > input(); go(); > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator