栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

zoj 3642 Just Another Informa...

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

zoj 3642 Just Another Informa...

#include <cstdio>#include <cstring>#include <set>#include <map>#include <algorithm>using namespace std;const int N = 205;const int V = 515;const int E = 50015;const int INF = 0x3f3f3f3f;struct Edge{ int v, c; Edge *nxt, *neg;} pool[E], *nowe, *adj[V], *cur[E];int nv;int h[V], gap[V], pre[V], vis[V], his[V];map<int, int> mp;int mat[N][11], id, odg[N];int isap(const int &s, const int &t){ memcpy(cur, adj, sizeof (Edge *) * nv); int u = pre[s] = s, v, found; int ret = 0, aug = INF; gap[0] = nv; while (h[s] < nv) { found = 0; his[u] = aug; for (Edge *&e = cur[u]; e; e = e->nxt) if (e->c && h[u] == h[v = e->v] + 1) { if (aug > e->c) aug = e->c; pre[v] = u; u = v; found = 1; if (v == t) { ret += aug; for (u = pre[u]; v != s; v = u, u = pre[u]) cur[u]->c -= aug, cur[u]->neg->c += aug; aug = INF; } break; } if (!found) { int &dis = h[u]; if (--gap[dis] == 0) break; dis = nv; for (Edge *e = adj[u]; e; e = e->nxt) if (e->c && h[e->v] < dis) dis = h[e->v], cur[u] = e; ++gap[++dis]; u = pre[u]; aug = his[u]; } } return ret;}inline void init(const int &n){ nv = n + 202; for (int i = 0; i < nv; ++i) adj[i] = NULL, h[i] = 0, gap[i] = 0; nowe = pool; id = n + 1; mp.clear();}inline void add(const int &u, const int &v, const int &c){ Edge *&au = adj[u], *&av = adj[v]; nowe->v = v, nowe->c = c, nowe->nxt = au, au = nowe++, au->neg = nowe; nowe->v = u, nowe->c = 0, nowe->nxt = av, av = nowe++, av->neg = au;}inline int insert(const int &num){ if (mp.find(num) != mp.end()) return mp[num]; mp[num] = id++; return id - 1;}int main(){ int n, q; int S, T; while (scanf("%d", &n) == 1) { init(n); S = 0, T = nv - 1; for (int i = 1; i <= n; ++i) { scanf("%d %d %d", &mat[i][0], odg + i, odg + i); for (int j = 1; j <= mat[i][0]; ++j) { scanf("%d", &mat[i][j]); mat[i][j] = insert(mat[i][j]); } } scanf("%d", &q); for (int i = 1; i <= n; ++i) for (int j = 1; j <= mat[i][0]; ++j) add(i, mat[i][j], 1); for (int i = 1; i <= n; ++i) add(S, i, (i == q) ? INF : odg[i]); for (int i = n + 1; i < id; ++i) add(i, T, 1); printf("%dn", isap(S, T)); } return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380591.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号