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

zoj 1994 Budget

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

zoj 1994 Budget

#include<cstring>#include<iostream>#include<iomanip>#include<cstdio>#include<cctype>#include<algorithm>#include<queue>#include<map>#include<set>#include<vector>#include<stack>#include<ctime>#include<cstdlib>#include<functional>#include<cmath>using namespace std;#define PI acos(-1.0)#define MAXN 100100#define eps 1e-7#define INF 0x7FFFFFFF#define seed 131#define ll long long#define ull unsigned ll#define lson l,m,rt<<1#define rson r,m+1,rt<<1|1struct node{    int u,v,w,next;}edge[20000];int head[250],dist[250],cur[250],fa[250],num[250];int low[300][300],upp[300][300],D[250];int n,m,cnt,nn,src,sink,supersrc,supersink;void add_edge(int a,int b,int c){    edge[cnt].u = a;    edge[cnt].v = b;    edge[cnt].w = c;    edge[cnt].next = head[a];    head[a] = cnt++;}void build_graph(){    int i,j;    for(i=1;i<=n;i++){        for(j=n+1;j<=n+m;j++){ D[i] -= low[i][j]; D[j] += low[i][j]; add_edge(i,j,upp[i][j]-low[i][j]); add_edge(j,i,0);        }    }    add_edge(sink,src,INF);    add_edge(src,sink,0);    for(i=0;i<=n+m+1;i++){        if(D[i]==0) continue;        else if(D[i]>0){ add_edge(supersrc,i,D[i]); add_edge(i,supersrc,0);        }        else{ add_edge(i,supersink,-D[i]); add_edge(supersink,i,0);        }    }}void bfs(){    int x,i,j;    queue<int> q;    memset(dist,-1,sizeof(dist));    q.push(supersink);    dist[supersink] = 0;    while(!q.empty()){        x = q.front();        q.pop();        for(i=head[x];i!=-1;i=edge[i].next){ if(dist[edge[i].v]<0){     dist[edge[i].v] = dist[x] + 1;     q.push(edge[i].v); }        }    }}int augment(){    int x=supersink,a=INF;    while(x!=supersrc){        a = min(a,edge[fa[x]].w);        x = edge[fa[x]].u;    }    x=supersink;    while(x!=supersrc){        edge[fa[x]].w -= a;        edge[fa[x]^1].w += a;        x = edge[fa[x]].u;    }    return a;}int isap(){    int i,x,ok,minm,flow=0;    memset(num,0,sizeof(num));    bfs();    for(i=0;i<=nn+1;i++) num[dist[i]]++;    for(i=0;i<=nn+1;i++) cur[i] = head[i];    x=supersrc;    while(dist[supersrc]<nn){        if(x==supersink){ flow += augment(); x = supersrc;        }        ok=0;        for(i=cur[x];i!=-1;i=edge[i].next){ if(edge[i].w && dist[x]==dist[edge[i].v]+1){     ok=1;     fa[edge[i].v] = i;     cur[x] = i;     x = edge[i].v;     break; }        }        if(!ok){ minm = nn; for(i=head[x];i!=-1;i=edge[i].next)     if(edge[i].w && dist[edge[i].v]<minm)   minm=dist[edge[i].v]; if(--num[dist[x]]==0)break; num[dist[x]=minm+1]++; cur[x]=head[x]; if(x!=supersrc)  x=edge[fa[x]].u;        }    }    return flow;}int main(){    int t,q,i,j;    int a,b,c,d;    char str[5];    scanf("%d",&t);    int cas = 0;    while(t--){        if(!cas)    cas = 1;        else    puts("");        scanf("%d%d",&n,&m);        memset(head,-1,sizeof(head));        memset(D,0,sizeof(D));        cnt = 0;        src = 0;        sink = n + m + 1;        supersrc = sink + 1;        supersink = sink + 2;        nn = sink + 3;        for(i=0;i<=n+3;i++){ for(j=n+1;j<=n+m+3;j++){     low[i][j] = 0;     upp[i][j] = INF; }        }        for(i=1;i<=n;i++){ scanf("%d",&a); D[src] -= a; D[i] += a;        }        for(i=n+1;i<=n+m;i++){ scanf("%d",&a); D[i] -= a; D[sink] += a;        }        int r1,r2,c1,c2;        scanf("%d",&q);        while(q--){ scanf("%d%d%s%d",&a,&b,str,&c); if(a==0){     r1 = 1;     r2 = n; } else    r1 = r2 = a; if(b==0){     c1 = n + 1;     c2 = n + m; } else    c1 = c2 = b + n; for(i=r1;i<=r2;i++){     for(j=c1;j<=c2;j++){         if(str[0]=='<') upp[i][j] = min(c-1,upp[i][j]);         else if(str[0]=='>')    low[i][j] = max(c+1,low[i][j]);         else{  low[i][j] = max(c,low[i][j]);  upp[i][j] = min(c,upp[i][j]);         }     } }        }        build_graph();        isap();        int flag = 0;        for(i=head[supersrc];i!=-1;i=edge[i].next){ if(edge[i].w!=0){     flag = 1;     break; }        }        if(flag)    puts("IMPOSSIBLE");        else{ for(i=1;i<=n;i++){     for(j=1;j<m;j++){         printf("%d ",edge[(((i-1)*m+j-1)*2)^1].w+low[i][j+n]);     }     printf("%dn",edge[(((i-1)*m+j-1)*2)^1].w+low[i][j+n]); }        }    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/377266.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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