POJ
来源:互联网 发布:学mysql还是sql server 编辑:程序博客网 时间:2024/06/05 17:12
POJ - 1459
题意:看题看的心累,其实就是所有power station是源点,所有consumer是汇点,然后就是一个最大流问题了~
读入写的有点蠢,其实scanf(" ()")
这种就够啦~
另外,对于单路增广的dinic来说,当前弧优化真的很有必要。
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cmath>#include <queue>using namespace std;const int maxn = 200 + 10, maxe = maxn*maxn;const int inf = 0x3f3f3f3f;struct node{ int to,next,cap,rev; node(){} node(int a,int b,int c,int d){to = a; next = b; cap = c; rev = d;}}edge[maxe << 2];int num;int h[maxn],deg[maxn],cur[maxn];int n,np,nc,m;int s,t; //源, 汇void init(){ for(int i = 0; i < maxn; i++) h[i] = -1,deg[i] = 0; s = 0, t = n+1; num = 0;}void add(int u,int v,int cap){ edge[num] = node(v,h[u],cap,num+1); h[u] = num++; edge[num] = node(u,h[v],0,num-1); h[v] = num++;}int bfs(){ for(int i = 0; i < maxn; i++) deg[i] = -1; queue<int> q; q.push(0); deg[0] = 0; while(!q.empty()) { int u = q.front(); q.pop(); for(int i = h[u] ; ~i ; i = edge[i].next) { int v = edge[i].to,cap = edge[i].cap; if(cap && deg[v] == -1) { deg[v] = deg[u] + 1; q.push(v); } } } return deg[t] != -1;}int dfs(int u,int f){ if(u == t) return f; for(int i = cur[u]; ~i; i = edge[i].next) { cur[u] = i; int v = edge[i].to,cap = edge[i].cap, rev = edge[i].rev; if(cap && deg[v] == deg[u] + 1) { int k = dfs(v,min(f,cap)); if(k == 0) continue; edge[i].cap -= k; edge[rev].cap += k; return k; } } return 0;}void solve(){ int flow = 0; while(bfs()) { for(int i = 0; i < maxn; i++) cur[i] = h[i]; for(;;) { int k = dfs(0,inf); if(k == 0) break; flow += k; } } printf("%d\n",flow);}char str[1000];void readnum(int way){ int v = 0,cap = 0; scanf("%s",str); int slen = strlen(str); int j; for(j = 1; j < slen; j++) { if(str[j] == ')') break; v = v*10 + str[j] - '0'; } j++; for(; j < slen; j++) cap = cap*10 + str[j] - '0'; if(way) add(s,v+1,cap); else add(v+1,t,cap);}void read(){ for(int i = 0; i < m; i++) { int u = 0,v = 0,cap = 0; scanf("%s",str); int slen = strlen(str); int j; for(j = 1; j < slen;j++) { if(str[j] == ',') break; u = u*10 + str[j] - '0'; } j++; for(; j < slen; j++) { if(str[j] == ')') break; v = v*10 + str[j] - '0'; } j++; for(; j < slen; j++) cap = cap*10 + str[j] - '0'; // cout << u << " " << v << " " <<cap << endl; add(u+1,v+1,cap); } for(int i = 0; i < np; i++) readnum(1); for(int i = 0; i < nc; i++) readnum(0);}int main(){ //freopen("D:\\in.txt","r",stdin); int a,b,c; while(~scanf("%d",&n)) { init(); scanf("%d%d%d",&np,&nc,&m); read(); solve(); } return 0;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- mui上拉加载插件+Vue
- android native crash的处理机制
- java.lang.Integer cannot be cast to java.lang.String
- java中的进制转换及转换函数
- setSavepoint()进行数据库存档,mysql事务,rollback()回滚
- POJ
- SpringBoot 初探
- Scheme学习系列一 :源码安装Gambit
- 生成指定文件目录下的文件树
- Android 项目构建过程
- Java中this关键字用法
- CVPR 2017 Abstracts Collection
- Hive开发UDF
- NLTK使用总结