• <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
            

            二、分析
                  一個(gè)簡(jiǎn)單的最優(yōu)匹配問(wèn)題,但要注意它要求的是最小權(quán)匹配,可以改成最大權(quán)匹配(第57行)用KM算法,詳細(xì)算法:匹配問(wèn)題。
            三、代碼
             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 閱讀(690) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 解題報(bào)告
            国产日产久久高清欧美一区| 77777亚洲午夜久久多喷| 91久久精品国产91性色也| 人妻丰满?V无码久久不卡| 亚洲精品无码久久久久sm| 国产精品亚洲美女久久久| 亚洲精品视频久久久| 国产精品久久久久AV福利动漫| 国产精品美女久久久久AV福利| 亚洲午夜久久久久久噜噜噜| 国产99久久久国产精品~~牛| 久久精品日日躁夜夜躁欧美| 狠狠色综合久久久久尤物| 色欲久久久天天天综合网| 久久久久久久综合综合狠狠| 青青国产成人久久91网| 伊人久久大香线蕉综合影院首页| 国产高潮久久免费观看| 久久久久久国产精品免费无码| 免费一级欧美大片久久网| 青青草原1769久久免费播放| 国产精品青草久久久久婷婷| 日韩人妻无码一区二区三区久久| 香蕉久久夜色精品国产尤物| 一本久久a久久精品综合夜夜| 国产精品久久久久AV福利动漫| 色偷偷久久一区二区三区| 伊人久久大香线蕉亚洲五月天 | 久久精品国产亚洲av麻豆小说 | 91精品国产高清久久久久久91| 日韩精品久久久久久免费| 久久精品国产日本波多野结衣| 武侠古典久久婷婷狼人伊人| 久久久久久毛片免费看| 亚洲国产小视频精品久久久三级| 久久久久人妻一区精品果冻| 久久精品一区二区影院| 日日狠狠久久偷偷色综合免费| 欧美久久天天综合香蕉伊| 日韩十八禁一区二区久久| 国产成人综合久久精品红|