UVa11506 - Angry Programmer(ISAP)

简介: UVa11506 - Angry Programmer(ISAP)
#include <cstdio>  #include <queue>  #include <cstring>  #include <algorithm>  usingnamespacestd;  
constintN=110;  
constintINF=0x3f3f3f3f;  
intm, w;   
intd[N], num[N];  
intcur[N], p[N];
intcap[N][N], flow[N][N];
boolinput();  
voidrev_bfs();
intmax_flow();
intAugment();
intRetreat(int&i);
intmain()  
{  
#ifndef ONLINE_JUDGE  freopen("d:\\OJ\\uva_in.txt", "r", stdin);  
#endif  while (input()) {  
intans=max_flow();
printf("%d\n", ans);  
    }  
return0;  
}  
boolinput()  
{  
if (scanf("%d%d", &m, &w) !=2|| (m==0&&w==0)) returnfalse;  
intu, v, c;  
memset(cap, 0x00, sizeof(cap));
memset(flow, 0x00, sizeof(flow));
for (inti=0; i<m-2; i++) {  
scanf("%d%d", &u, &c);  
cap[u][u+m] =cap[u+m][u] =c;
    }  
for (inti=0; i<w; i++) {  
scanf("%d%d%d", &u, &v, &c);  
if (u==1&&v==m) {
cap[u][v] =cap[v][u] =c;
        } elseif (u==1&&v!=m) {  
cap[u][v] =c;
cap[v+m][u] =c;
        } elseif (u==m&&v==1) {  
cap[u][v] =cap[v][u] =c;
        } elseif (u==m&&v!=1) {   
cap[u][v] =c;
cap[v+m][u] =c;
        } else {  
cap[u+m][v] =c;
cap[v+m][u] =c;
        }  
    }  
returntrue;  
}  
voidrev_bfs()
{
queue<int>q;
memset(num, 0x00, sizeof(num));
for (inti=1; i<=2*m; i++) {
num[d[i] =2*m]++;
    }
num[2*m]--;
d[m] =0;
num[0]++;
q.push(m);
while (!q.empty()) {
intv=q.front(); q.pop();
for (intu=1; u<2*m; u++) {
if (d[u] <2*m||cap[u][v] ==0) continue;
q.push(u);
num[d[u]]--;
d[u] =d[v] +1;
num[d[u]]++;
        }
    }
}
intmax_flow()
{
intf=0, i, j;
memset(d, 0x00, sizeof(d));
memset(p, 0x00, sizeof(p));
rev_bfs();
for (i=1; i<=2*m; i++) cur[i] =1;
i=1;
for (; d[1] <2*m; )
    {
for (j=cur[i]; j<=2*m; j++) {
if (cap[i][j] >flow[i][j] &&d[i] ==d[j] +1) break;
        }
if (j<=2*m) {
cur[i] =j;
p[j] =i;
i=j;
if (i==m) {
f+=Augment();
i=1;
            }
        } else {
cur[i] =1;
if (Retreat(i) ==0) break;
        }
    }
returnf;
}
intAugment()
{
intans=INF;
for (inti=m, j=p[i]; i!=1; i=j, j=p[j]) {
ans=min(ans, cap[j][i] -flow[j][i]);
    }
for (inti=m,  j=p[i]; i!=1; i=j, j=p[j]) {
flow[j][i] +=ans;
flow[i][j] -=ans;
    }
returnans;
}
intRetreat(int&i)
{
intmind=2*m-1;
for (intj=1; j<=2*m; j++) {
if (cap[i][j] >flow[i][j] &&d[j] <mind) {
mind=d[j];
        }
    }
inttmp=d[i];
num[d[i]]--;
d[i] =mind+1;
num[d[i]]++;
if (i!=1) i=p[i];
returnnum[tmp];
}
kgduu
+关注
目录
打赏
0
0
0
0
0
分享
相关文章
Spring中Bean注入与获取几种方式详解
Spring中Bean注入与获取几种方式详解
678 0
Redis是一种高性能的内存数据库,常用于高并发环境下的缓存解决方案
【6月更文挑战第18天】**Redis摘要:** 高性能内存数据库,擅长高并发缓存。数据存内存,访问迅速;支持字符串、列表等多元数据类型;具备持久化防止数据丢失;丰富命令集便于操作;通过节点集群实现数据分片与负载均衡,增强可用性和扩展性。理想的缓存解决方案。
159 1
通过计算的文本宽度,由于小数四舍五入引起的文字显示不全问题
通过计算的文本宽度,由于小数四舍五入引起的文字显示不全问题
68 0
匿名内部类&Lambda表达式&函数式接口
匿名内部类&Lambda表达式&函数式接口
88 0
【数据结构】典型数据结构的类型和概念
【数据结构】典型数据结构的类型和概念
87 0
基于参考辐射源/定标的校正算法(一)
一种基于场景的非均匀校正算法,补充一下更加简单,容易工程化实现的基于参考辐射源的校正算法,也叫基于定标的校正算法。
308 0
基于参考辐射源/定标的校正算法(一)
数据开发(DataStudio)降本提效的核心利器 | 《一站式大数据开发治理DataWorks使用宝典》
随着阿里集团登月计划的启动和数据中台的发展,DataWorks也进行了多次迭代。2015年DataWorks以D+的形态进入公共云及专有云市场,开始服务政企用户。2016年数加平台发布,数加品牌把DataWorks和MaxCompute这个强有力的组合推向市场。2017、2018和2020年,DataWorks完成了国际化及从2.0到3.0版本的升级。 现在,DataWorks已经成为了一个能够支持多个引擎、多实例以及跨地域调度的强大的大数据生产调度工具了。
2442 1
数据开发(DataStudio)降本提效的核心利器 | 《一站式大数据开发治理DataWorks使用宝典》
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等