POJ 2195 - Going Home 更新最小费用最大流模板..整合成结构体...

来源:互联网 发布:家居设计软件有哪些 编辑:程序博客网 时间:2024/04/27 07:07

           Ps...我发现现在这个代码怎么优化还是没有以前写的那个快..以前那个还是用的临接矩阵..真是蛋疼....不过也够用了...


Program:

#include<iostream>#include<stdio.h>#include<string.h>#include<cmath>#include<queue>#include<stack>#include<set>#include<time.h>#include<map>#include<algorithm>#define ll long long#define eps 1e-5#define oo 1000000007#define pi acos(-1.0)#define MAXN 250#define MAXM 500005using namespace std;char S[110][110];int H[110],M[110];struct MCMF{       struct node       {              int x,y,c,v,next;        }line[MAXM];       int Lnum,_next[MAXN],pre[MAXN],dis[MAXN],flow,cost;       bool inqueue[MAXN];       void initial(int n)       {              Lnum=-1;              for (int i=0;i<=n;i++) _next[i]=-1;       }       void addline(int x,int y,int c,int v)       {              line[++Lnum].next=_next[x],_next[x]=Lnum;              line[Lnum].x=x,line[Lnum].y=y,line[Lnum].c=c,line[Lnum].v=v;              line[++Lnum].next=_next[y],_next[y]=Lnum;              line[Lnum].x=y,line[Lnum].y=x,line[Lnum].c=0,line[Lnum].v=-v;       }       bool SPFA(int s,int e)       {              int x,k,y;              queue<int> Q;              while (!Q.empty()) Q.pop();              memset(dis,0x7f,sizeof(dis));              memset(inqueue,false,sizeof(inqueue));              Q.push(s);              dis[s]=0,pre[s]=-1;              while (!Q.empty())              {                      x=Q.front(),Q.pop(),inqueue[x]=false;                      for (k=_next[x];k!=-1;k=line[k].next)                           if (line[k].c)                         {                               y=line[k].y;                               if (dis[y]>dis[x]+line[k].v)                               {                                        dis[y]=dis[x]+line[k].v;                                        pre[y]=k;                                        if (!inqueue[y])                                        {                                                inqueue[y]=true;                                                Q.push(y);                                        }                               }                         }              }              if (dis[e]>oo) return false;              flow=oo,cost=0;              for (k=pre[e];k!=-1;k=pre[line[k].x])                   flow=min(flow,line[k].c),cost+=line[k].v;                  cost*=flow;              for (k=pre[e];k!=-1;k=pre[line[k].x])                  line[k].c-=flow,line[k^1].c+=flow;                return true;       }       int MinCostMaxFlow(int s,int e)       {              int Aflow=0,Acost=0;              while (SPFA(s,e))              {                     Aflow+=flow;                     Acost+=cost;               }              return Acost;       }}T;int main(){              int R,C,i,j,k,n,m,s,e;       freopen("input.txt","r",stdin);       freopen("output.txt","w",stdout);         while (~scanf("%d%d",&R,&C) && (R || C))       {               for (i=0;i<R;i++) scanf("%s",S[i]);               n=m=0;               for (i=0;i<R;i++)                  for (j=0;j<C;j++)                  {                        if (S[i][j]=='m') M[++n]=i*C+j;                        if (S[i][j]=='H') H[++m]=i*C+j;                  }               s=n+m+1,e=s+1,T.initial(e);               for (i=1;i<=n;i++) T.addline(s,i,1,0);               for (i=1;i<=m;i++) T.addline(i+n,e,1,0);               for (i=1;i<=n;i++)                  for (j=1;j<=m;j++)                       T.addline(i,j+n,1,abs(M[i]/C-H[j]/C)+abs(M[i]%C-H[j]%C));                 printf("%d\n",T.MinCostMaxFlow(s,e));       }       return 0;}


原创粉丝点击