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

poj 2396 Budget

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

poj 2396 Budget

#include<iostream>  #include<cstdio>  #include<algorithm>  #include<string>  #include<cstring>  using namespace std;  #define MAXN 500   #define INF 0xFFFFFF  #define MAXM 9999999  struct edge  {      int to,c,next;  }e[MAXM];  struct node  {      int c,l;  }matrix[250][50];  int head[MAXN],en,l[MAXN];  int dis[MAXN],gap[MAXN],st,ed;  int n,m,vn;  void add(int a,int b,int c)  {      e[en].to=b,e[en].c=c,e[en].next=head[a],head[a]=en++;      e[en].to=a,e[en].c=0,e[en].next=head[b],head[b]=en++;  }  int isap(int u,int flow)   {      if(u==ed)          return flow;      int j,mindis=vn-1,t=flow,d;      for(j=head[u];j!=-1;j=e[j].next)       {          int v=e[j].to,val=e[j].c;          if(val>0){   if(dis[v]+1==dis[u])    {       if(t<e[j].c) d=t;       else d=e[j].c;       d=isap(v,d);       e[j].c-=d,e[j^1].c+=d;       t-=d;       if(dis[st]>=vn)return flow-t;       if(t==0) break;   }   if(dis[v]<mindis)       mindis=dis[v];          }      }      if(t==flow)       {          --gap[dis[u]];          if (gap[dis[u]]==0)    dis[st]=vn;          dis[u]=mindis+1;          ++gap[dis[u]];      }      return flow-t;  }  void solve()  {      int a,b,c,q;      char str[5];      en=0;      scanf("%d%d",&m,&n);      memset(matrix,0,sizeof(matrix));      memset(l,0,sizeof(l));      memset(head,-1,sizeof(head));      for(int i=1;i<=m;i++)          for(int j=1;j<=n;j++)   matrix[i][j].c=INF;      for(int i=1;i<=m;i++)      {          scanf("%d",&matrix[i][0].c);          matrix[i][0].l=matrix[i][0].c;      }      for(int i=1;i<=n;i++)      {          scanf("%d",&matrix[0][i].c);          matrix[0][i].l=matrix[0][i].c;      }      scanf("%d",&q);      bool flag=false;      while(q--)      {          scanf("%d%d%s%d",&a,&b,&str,&c);          if(flag)   continue;          if(str[0]=='<')          {   if(a && b)   {       matrix[a][b].c=min(c-1,matrix[a][b].c);       if(matrix[a][b].c<matrix[a][b].l) flag=true;   }   if(!a && !b)   {       for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){        matrix[i][j].c=min(c-1,matrix[i][j].c);        if(matrix[i][j].c<matrix[i][j].l) flag=true;}   }   if(!a && b)   {       for(int i=1;i<=m;i++)       {matrix[i][b].c=min(c-1,matrix[i][b].c);if(matrix[i][b].c<matrix[i][b].l) flag=true;       }   }   if(a && !b)   {       for(int i=1;i<=n;i++)       {matrix[a][i].c=min(c-1,matrix[a][i].c);if(matrix[a][i].c<matrix[a][i].l) flag=true;       }   }          }  if(str[0]=='>')          {   if(a && b)   {       matrix[a][b].l=max(c+1,matrix[a][b].l);       if(matrix[a][b].l>matrix[a][b].c) flag=true;   }   if(!a && !b)   {       for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){    matrix[i][j].l=max(c+1,matrix[i][j].l);    if(matrix[i][j].l>matrix[i][j].c) flag=true;}   }   if(!a && b)   {       for(int i=1;i<=m;i++)       {matrix[i][b].l=max(c+1,matrix[i][b].l);if(matrix[i][b].l>matrix[i][b].c) flag=true;       }   }   if(a && !b)   {       for(int i=1;i<=n;i++)       {matrix[a][i].l=max(c+1,matrix[a][i].l);if(matrix[a][i].l>matrix[a][i].c) flag=true;       }   }  }          if(str[0]=='=')          {   if(a && b)   {       if(c<=matrix[a][b].c && c>=matrix[a][b].l) matrix[a][b].c=matrix[a][b].l=c;       else flag=true;   }   if(!a && !b)   {       for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){    if(c<=matrix[i][j].c && c>=matrix[i][j].l) matrix[i][j].c=matrix[i][j].l=c;    else flag=true;}   }   if(!a && b)   {       for(int i=1;i<=m;i++)       {if(c<=matrix[i][b].c && c>=matrix[i][b].l) matrix[i][b].c=matrix[i][b].l=c;else flag=true;       }   }   if(a && !b)   {       for(int i=1;i<=n;i++)       {if(c<=matrix[a][i].c && c>=matrix[a][i].l) matrix[a][i].c=matrix[a][i].l=c;else flag=true;       }   }          }         }      if(flag)      {          printf("IMPOSSIBLEn");          return ;      }      for(int i=1;i<=m;i++)      {          for(int j=1;j<=n;j++)          {   l[i]-=matrix[i][j].l;   l[j+m]+=matrix[i][j].l;   add(i,j+m,matrix[i][j].c-matrix[i][j].l);          }      }      for(int i=1;i<=m;i++)      {          l[i]+=matrix[i][0].l;          l[0]-=matrix[i][0].l;          add(0,i,0);      }      for(int i=1;i<=n;i++)      {          l[i+m]-=matrix[0][i].l;          l[n+m+1]+=matrix[0][i].l;          add(i+m,m+n+1,0);      }      st=n+m+2,ed=n+m+3;      vn=n+m+4;      int full=0;      int maxflow=0;      for(int i=0;i<=n+m+1;i++)      {          if(l[i]>0)          {   add(st,i,l[i]);   full+=l[i];          }          else   add(i,ed,-l[i]);      }      add(0,n+m+1,INF);      add(n+m+1,0,INF);      memset(gap,0,sizeof(gap)),memset(dis,0,sizeof(dis));      gap[0]=vn;      while(dis[st]<vn)          maxflow+=isap(st,INF);      if(maxflow!=full)      {          printf("IMPOSSIBLEn");          return ;      }      for(int i=1;i<=m;i++)      {          for(int j=1;j<=n;j++)          {   printf("%d",e[((i-1)*n+j-1)*2^1].c+matrix[i][j].l);   if(j!=n)       printf(" ");          }          printf("n");      }  }  int main()  {      int t;      bool flag=false;      scanf("%d",&t);      while(t--)      {          if(flag)   printf("n");          flag=true;          solve();      }      return 0;  }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373092.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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