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];
}
目录
相关文章
|
7月前
uva 11991 - Easy Problem from Rujia Liu?
这个题目的意思是输入n个数,m组询问,每组询问包含两个整数k,v,意思是询问整数v第k次出现的位置。
29 0
|
9月前
UVa1531 - Problem Bee
UVa1531 - Problem Bee
35 0
|
9月前
UVa389 - Basically Speaking
UVa389 - Basically Speaking
24 0
|
人工智能 Java C++
|
C++
uva 12096 The SetStack Computer
点击打开链接uva 12096 思路: STL模拟 分析: 1 题目给定5种操作,每次输出栈顶集合的元素的个数 2 利用stack和set来模拟,set保存集合的元素。
823 0
|
C++
uva 11991 Easy Problem from Rujia Liu?
点击打开链接uva 11991 思路: STL 分析: 1 题目要求的是第k个v的下标 2 题目的规模是10^6如果用暴力的话那么超时是肯定的,所以这里应该考虑用vector数组,每一个值作为一个vector,,然后把这个值出现在第几个位...
829 0