• 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
    ",c);
    115     }
    116     return 0;
    117 }
    View Code
  • 相关阅读:
    求助
    第五次作业
    第四次作业
    第三次作业
    第二次作业(四则运算)
    关于软件工程相关疑问
    小组成员名单()
    第四次作业
    第二次作业
    第一次作业
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3450259.html
Copyright © 2020-2023  润新知