poj 2195Going Home

http://poj.org/problem?id=2195

  1 #include<cstdio>

  2 #include<cstring>

  3 #include<cmath>

  4 #include<algorithm>

  5 #include<queue>

  6 #include<cstdlib>

  7 #define maxn 500

  8 using namespace std;

  9 int n,mm;

 10 char g[maxn][maxn];

 11 const int inf=1<<30;

 12 

 13 struct node

 14 {

 15     int x,y;

 16 }m[maxn];

 17 

 18 struct node1

 19 {

 20     int x,y;

 21 }h[maxn];

 22 

 23 int cap[maxn][maxn];

 24 int cost[maxn][maxn];

 25 int flow[maxn][maxn];

 26 int p[maxn];

 27 int s,t;

 28 int main()

 29 {

 30     while(scanf("%d%d",&n,&mm)&&n&&mm)

 31     {

 32         memset(cap,0,sizeof(cap));

 33         memset(cost,0,sizeof(cost));

 34         int t1=0,t2=0;

 35         for(int i=0; i<n; i++)

 36         {

 37             scanf("%s",g[i]);

 38             for(int j=0; j<mm; j++)

 39             {

 40                 if(g[i][j]=='m')

 41                 {

 42                     m[++t1].x=i;

 43                     m[t1].y=j;

 44                 }

 45                 else if(g[i][j]=='H')

 46                 {

 47                     h[++t2].x=i;

 48                     h[t2].y=j;

 49                 }

 50             }

 51         }

 52         for(int i=1; i<=t1; i++)

 53         {

 54             cap[0][i]=1;

 55             cost[0][i]=0;

 56         }

 57         for(int i=1; i<=t1; i++)

 58         {

 59             for(int j=1; j<=t2; j++)

 60             {

 61                 cap[i][t1+j]=1;

 62                 cost[i][t1+j]=abs(m[i].x-h[j].x)+abs(m[i].y-h[j].y);

 63                 cost[t1+j][i]=-cost[i][t1+j];

 64             }

 65         }

 66         for(int j=1; j<=t2; j++)

 67         {

 68             cap[t1+j][t1+t2+1]=1;

 69             cost[t1+j][t1+t2+1]=0;

 70         }

 71         s=0,t=t1+t2+1;

 72         queue<int>q;

 73         int d[maxn];

 74         memset(flow,0,sizeof(flow));

 75         int c=0,f=0;

 76         for(;;)

 77         {

 78             bool inq[maxn];

 79             for(int i=0; i<=t1+t2+1; i++) d[i]=(i==0?0:inf);

 80             memset(inq,0,sizeof(inq));

 81             q.push(s);

 82             while(!q.empty())

 83             {

 84                 int u=q.front();q.pop();

 85                 inq[u]=false;

 86                 for(int v=0; v<=t1+t2+1; v++) if(cap[u][v]>flow[u][v] && d[v]>d[u]+cost[u][v])

 87                 {

 88                     d[v]=d[u]+cost[u][v];

 89                     p[v]=u;

 90                     if(!inq[v])

 91                     {

 92                         inq[v]=true;

 93                         q.push(v);

 94                     }

 95                 }

 96             }

 97             if(d[t]==inf) break;

 98             int a=inf;

 99             for(int u=t; u!=s; u=p[u])

100             {

101                 if(cap[p[u]][u]-flow[p[u]][u]<a)

102                 {

103                     a=cap[p[u]][u]-flow[p[u]][u];

104                 }

105             }

106             for(int u=t; u!=s; u=p[u])

107             {

108                 flow[p[u]][u]+=a;

109                 flow[u][p[u]]-=a;

110             }

111             c+=d[t]*a;

112             f+=a;

113         }

114         printf("%d\n",c);

115     }

116     return 0;

117 }
View Code

 

你可能感兴趣的:(home)