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

zoj 2930 The Worst Schedule

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

zoj 2930 The Worst Schedule

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxnode = 40000 + 5;const int maxedge = 1000000 + 5;const int oo = 1000000000;int node, src, dest, nedge;int head[maxnode], point[maxedge], next[maxedge], flow[maxedge], capa[maxedge];int dist[maxnode], Q[maxnode], work[maxnode];void init(int _node, int _src, int _dest) { node = _node; src = _src; dest = _dest; for (int i = 0; i < node; i++) head[i] = -1; nedge = 0;}void addedge(int u, int v, int c1, int c2) { point[nedge] = v, capa[nedge] = c1, flow[nedge] = 0, next[nedge] = head[u], head[u] = (nedge++); point[nedge] = u, capa[nedge] = c2, flow[nedge] = 0, next[nedge] = head[v], head[v] = (nedge++);}bool dinic_bfs() { memset(dist, 255, sizeof (dist)); dist[src] = 0; int sizeQ = 0; Q[sizeQ++] = src; for (int cl = 0; cl < sizeQ; cl++) for (int k = Q[cl], i = head[k]; i >= 0; i = next[i]) if (flow[i] < capa[i] && dist[point[i]] < 0) { dist[point[i]] = dist[k] + 1; Q[sizeQ++] = point[i]; } return dist[dest] >= 0;}int dinic_dfs(int x, int exp) { if (x == dest) return exp; for (int &i = work[x]; i >= 0; i = next[i]) { int v = point[i], tmp; if (flow[i] < capa[i] && dist[v] == dist[x] + 1 && (tmp = dinic_dfs(v, min(exp, capa[i] - flow[i]))) > 0) { flow[i] += tmp; flow[i^1] -= tmp; return tmp; } } return 0;}int dinic_flow() { int result = 0; while (dinic_bfs()) { for (int i = 0; i < node; i++) work[i] = head[i]; while (1) { int delta = dinic_dfs(src, oo); if (delta == 0) break; result += delta; } } return result;}int N;int val[210];bool used[220];void dfs(int u){ used[u] = true; for (int i = head[u]; i >= 0; i = next[i]){ int v = point[i]; if (flow[i] < capa[i] && used[v] == false) dfs( v ); }}int main(){ while( ~scanf("%d",&N) ){ int ans = 0; int psum = 0; memset(used,false,sizeof(used)); init(N+2, 0, N+1); for(int i=1; i<=N; ++i){ scanf("%d",&val[i]); ans += val[i]; } for(int i=1; i<=N; ++i){ int x; scanf("%d",&x); val[i] = val[i] - x; if( val[i] > 0 ){ psum += val[i]; addedge(src, i, val[i], 0); } else addedge(i, dest, -val[i], 0); } int m; scanf("%d",&m); while(m--){ int x,y; scanf("%d%d",&x,&y); addedge(x, y, oo, 0); } ans = ans-psum+dinic_flow(); int num = 0; dfs(src); for(int i=1; i<=N; ++i) if( used[i] == false ) num++; printf("%d %dn",ans,num); } return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370608.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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