• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 18,  comments - 5,  trackbacks - 0
            一、題目描述

            Description

            On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertically, to an adjacent point. For each little man, you need to pay a $1 travel fee for every step he moves, until he enters a house. The task is complicated with the restriction that each house can accommodate only one little man.

            Your task is to compute the minimum amount of money you need to pay in order to send these n little men into those n different houses. The input is a map of the scenario, a '.' means an empty space, an 'H' represents a house on that point, and am 'm' indicates there is a little man on that point.

            You can think of each point on the grid map as a quite large square, so it can hold n little men at the same time; also, it is okay if a little man steps on a grid with a house without entering that house.

            Input

            There are one or more test cases in the input. Each case starts with a line giving two integers N and M, where N is the number of rows of the map, and M is the number of columns. The rest of the input will be N lines describing the map. You may assume both N and M are between 2 and 100, inclusive. There will be the same number of 'H's and 'm's on the map; and there will be at most 100 houses. Input will terminate with 0 0 for N and M.

            Output

            For each test case, output one line with the single integer, which is the minimum amount, in dollars, you need to pay.

            Sample Input

            2 2
            .m
            H.
            5 5
            HH..m
            .....
            .....
            .....
            mm..H
            7 8
            ...H....
            ...H....
            ...H....
            mmmHmmmm
            ...H....
            ...H....
            ...H....
            0 0
            

            Sample Output

            2
            10
            28
            

            二、分析
                  一個簡單的最優匹配問題,但要注意它要求的是最小權匹配,可以改成最大權匹配(第57行)用KM算法,詳細算法:匹配問題。
            三、代碼
             1#include<iostream>
             2#include<cmath>
             3using namespace std;
             4int n, m;
             5char str[101];
             6int hc, home[100][2];
             7int mc, man[100][2];
             8int map[100][100];
             9int lx[100], ly[100];
            10int mat[100];
            11bool vx[100], vy[100];
            12int  slack[100];
            13bool dfs(int u)
            14{
            15    vx[u] = true;
            16    for(int v=0; v<mc; v++)
            17    {
            18        if(!vy[v] && lx[u]+ly[v] == map[u][v])
            19        {
            20            vy[v] = true;
            21            if(mat[v]==-1 || dfs(mat[v]))
            22            {
            23                mat[v] = u;
            24                return true;
            25            }

            26        }

            27        else if(lx[u]+ly[v] > map[u][v])
            28            slack[v] = min(slack[v], lx[u] + ly[v] - map[u][v]);
            29    }

            30    return false;
            31}

            32int main()
            33{
            34    while(1)
            35    {
            36        scanf("%d%d"&n, &m);
            37        if(n==0 && m==0)
            38            break;
            39        hc = mc = 0;
            40        for(int i=0; i<n; i++)
            41        {
            42            scanf("%s", str);
            43            for(int j=0; j<m; j++)
            44            {
            45                if(str[j] == 'H')
            46                {
            47                    home[hc][0= i; home[hc++][1= j;
            48                }

            49                else if(str[j] == 'm')
            50                {
            51                    man[mc][0= i; man[mc++][1= j;
            52                }

            53            }

            54        }

            55        for(int i=0; i<mc; i++)
            56            for(int j=0; j<mc; j++)
            57                map[i][j] = 200 - abs(man[i][0]-home[j][0]) - abs(man[i][1]-home[j][1]);
            58        memset(lx, 0sizeof(lx));
            59        memset(ly, 0sizeof(ly));
            60        for(int u=0; u<mc; u++)
            61            for(int v=0; v<hc; v++)
            62                lx[u] = max(lx[u], map[u][v]);
            63        memset(mat, -1sizeof(mat));
            64        for(int u=0; u<mc; u++)
            65        {
            66            while(1)
            67            {
            68                memset(vx, 0sizeof(vx));
            69                memset(vy, 0sizeof(vy));
            70                for(int j=0; j<mc; j++)
            71                    slack[j] = INT_MAX;
            72                if(dfs(u))
            73                    break;
            74                int al = INT_MAX;
            75                for(int i=0; i<mc; i++)
            76                    if(!vy[i])
            77                        al = min(al, slack[i]);
            78                for(int i=0; i<mc; i++)
            79                {
            80                    if(vx[i]) lx[i] -= al;
            81                    if(vy[i]) ly[i] += al;
            82                }

            83            }

            84        }

            85        int res = 0;
            86        for(int v=0; v<mc; v++)
            87            res += 200 - map[mat[v]][v];
            88        printf("%d\n", res);
            89    }

            90}
            posted on 2009-06-29 14:42 Icyflame 閱讀(673) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            国产三级久久久精品麻豆三级| 久久精品国产福利国产琪琪| 国产成人综合久久精品红| 久久久精品日本一区二区三区 | 精品久久久无码人妻中文字幕豆芽| 久久亚洲AV成人无码软件| 久久久亚洲欧洲日产国码aⅴ| 好久久免费视频高清| 色偷偷91久久综合噜噜噜噜| 浪潮AV色综合久久天堂| 久久久久婷婷| 国产精品久久久久天天影视| 中文字幕无码久久人妻| 狠色狠色狠狠色综合久久| 亚洲国产香蕉人人爽成AV片久久| 久久婷婷五月综合色奶水99啪| 精品久久久久久无码中文野结衣| 亚洲精品国精品久久99热一 | 久久亚洲精品无码VA大香大香| 精品人妻久久久久久888| 亚洲伊人久久综合影院| 一级做a爱片久久毛片| 亚洲精品无码久久久久去q| 久久国产成人| 狠狠人妻久久久久久综合蜜桃| 久久精品国产亚洲AV无码偷窥 | 狠狠色综合网站久久久久久久高清| 久久国产精品99久久久久久老狼| 亚洲精品无码专区久久久| 久久综合亚洲色一区二区三区| 久久国产V一级毛多内射| 国产亚洲色婷婷久久99精品91| 亚洲精品无码久久久久sm| 伊人久久综合无码成人网| 亚洲国产香蕉人人爽成AV片久久 | 色综合久久中文色婷婷| 国内精品伊人久久久久av一坑| 亚洲va久久久噜噜噜久久狠狠| 国产成人久久精品一区二区三区| 97精品依人久久久大香线蕉97| 97精品国产97久久久久久免费|