青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

infinity

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  36 隨筆 :: 0 文章 :: 25 評論 :: 0 Trackbacks
這是一個典型的最大匹配的題目,題目意思是給出一些房子和一些人,每個人到每個房子都有一個相應的代價,最后要求怎么安排這些人,房子和人一一配對,使最后的代價最小。
方法是KM算法,是一個求最大(最小)匹配的一個很強大的算法。不過這種題目還可以用費用流來做。

下面是某牛的對KM算法講解
http://hi.baidu.com/anonympine/blog/item/3ee64954fe6f6256574e0021.html

KM算法是通過給每個頂點一個標號(叫做頂標)來把求最大權匹配的問題轉化為求完備匹配的問題的。設頂點Xi的頂標為A[i],頂點Yi的頂標為B[i],頂點Xi與Yj之間的邊權為w[i,j]。在算法執行過程中的任一時刻,對于任一條邊(i,j),A[i]+B[j]>=w[i,j]始終成立。KM算法的正確性基于以下定理:
若由二分圖中所有滿足A[i]+B[j]=w[i,j]的邊(i,j)構成的子圖(稱做相等子圖)有完備匹配,那么這個完備匹配就是二分圖的最大權匹配。
這個定理是顯然的。因為對于二分圖的任意一個匹配,如果它包含于相等子圖,那么它的邊權和等于所有頂點的頂標和;如果它有的邊不包含于相等子圖,那么它的邊權和小于所有頂點的頂標和。所以相等子圖的完備匹配一定是二分圖的最大權匹配。
初始時為了使A[i]+B[j]>=w[i,j]恒成立,令A[i]為所有與頂點Xi關聯的邊的最大權,B[j]=0。如果當前的相等子圖沒有完備匹配,就按下面的方法修改頂標以使擴大相等子圖,直到相等子圖具有完備匹配為止。
我們求當前相等子圖的完備匹配失敗了,是因為對于某個X頂點,我們找不到一條從它出發的交錯路。這時我們獲得了一棵交錯樹,它的葉子結點全部是X頂點。現在我們把交錯樹中X頂點的頂標全都減小某個值d,Y頂點的頂標全都增加同一個值d,那么我們會發現:
  • 兩端都在交錯樹中的邊(i,j),A[i]+B[j]的值沒有變化。也就是說,它原來屬于相等子圖,現在仍屬于相等子圖。
  • 兩端都不在交錯樹中的邊(i,j),A[i]和B[j]都沒有變化。也就是說,它原來屬于(或不屬于)相等子圖,現在仍屬于(或不屬于)相等子圖。
  • X端不在交錯樹中,Y端在交錯樹中的邊(i,j),它的A[i]+B[j]的值有所增大。它原來不屬于相等子圖,現在仍不屬于相等子圖。
  • X端在交錯樹中,Y端不在交錯樹中的邊(i,j),它的A[i]+B[j]的值有所減小。也就說,它原來不屬于相等子圖,現在可能進入了相等子圖,因而使相等子圖得到了擴大。
  現在的問題就是求d值了。為了使A[i]+B[j]>=w[i,j]始終成立,且至少有一條邊進入相等子圖,d應該等于min{A[i]+B[j]-w[i,j]|Xi在交錯樹中,Yi不在交錯樹中}。

  以上就是KM算法的基本思路。但是樸素的實現方法,時間復雜度為O(n4)——需要找O(n)次增廣路,每次增廣最多需要修改O(n)次頂標,每次修改頂標時由于要枚舉邊來求d值,復雜度為O(n2)。實際上KM算法的復雜度是可以做到O(n3) 的。我們給每個Y頂點一個“松弛量”函數slack,每次開始找增廣路時初始化為無窮大。在尋找增廣路的過程中,檢查邊(i,j)時,如果它不在相等子圖 中,則讓slack[j]變成原值與A[i]+B[j]-w[i,j]的較小值。這樣,在修改頂標時,取所有不在交錯樹中的Y頂點的slack值中的最小 值作為d值即可。但還要注意一點:修改頂標后,要把所有的slack值都減去d。

Source Code

Problem: 2195
User: lovecanon
Memory: 368K
Time: 0MS
Language: G++
Result: Accepted
下面是2195我的代碼:
//algorithm:KM O(n^4)
#include<stdio.h>
#include
<string.h>
#include
<math.h>
#include
<stdlib.h>
struct node{
    
int r,c;
}man[
10001],home[10001];
int r,c,num_of_man,num_of_home,map[101][101],lx[101],ly[101],match[101];
bool visx[101],visy[101];

int dfs(int t){//尋找完備匹配
    int i,tmp;
    visx[t]
=true;
    
for(i=1;i<=num_of_home;i++){
        
if(!visy[i] && lx[t]+ly[i]==map[t][i]){
            tmp
=match[i];
            visy[i]
=true;
            match[i]
=t;
            
if(tmp==0 || dfs(tmp)) return 1;
            match[i]
=tmp;
        } 
    }
    
return 0;
}

int main(){
    
while(scanf("%d%d",&r,&c),r&&c){
        getchar();
        
int i,j,k; char a;
        num_of_home
=0;num_of_man=0;
        
for(i=1;i<=r;i++){//read_data
            for(j=1;j<=c;j++){
                
if((a=getchar())=='m'){
                    man[
++num_of_man].r=i;
                    man[num_of_man].c
=j;
                }
                
else if(a=='H'){
                    home[
++num_of_home].r=i;
                    home[num_of_home].c
=j;
                }
            }
            getchar();
        }
        
//printf("%d %d\n",num_of_man,num_of_home);
        memset(map,0,sizeof(map));
        
for(i=1;i<=num_of_man;i++){
            
for(j=1;j<=num_of_home;j++){
                map[i][j]
=(int )fabs(man[i].r-home[j].r)+(int )fabs(man[i].c-home[j].c);
            }
        }
        memset(lx,
127,sizeof(lx));
        memset(ly,
0,sizeof(ly));
        
for(i=1;i<=num_of_man;i++){
            
for(j=1;j<=num_of_home;j++){
                
if(map[i][j]<lx[i]) lx[i]=map[i][j];//如果是最大權值匹配 則初始值頂標取最大值
            }                                       //若是最小匹配則取最小值
        }
        
//KM algorithm 
        memset(match,0,sizeof(match));
        
for(i=1;i<=num_of_man;i++){//
            while(1){
                memset(visx,
0,sizeof(visx));//清零
                memset(visy,0,sizeof(visy));
                
int min=10000000;
                
if(dfs(i)) break;//尋找完備匹配 
                for(j=1;j<=num_of_man;j++){//找出 min=1000000;x搜索樹上y不在搜索樹上邊
                    if(visx[j])            //找出頂標最大能改進的d值
                    for(k=1;k<=num_of_home;k++){
                        
if(!visy[k] && map[j][k]-lx[j]-ly[k]<min)//基于 lx[i]+ly[j]<=map[i][j] 找出map[j][k]-lx[j]-ly[k]的最小值 d
                            min=map[j][k]-lx[j]-ly[k];           //若是最大匹配則應滿足 lx[i]+ly[j]>=map[i][j] 找出
                    }                                            //lx[i]-ly[j]-map[i][j]的最小值 d
                }
                
for(j=1;j<=num_of_man;j++if(visx[j]) lx[j]+=min;//用d來改進搜索樹上各點的頂標
                for(j=1;j<=num_of_home;j++if(visy[j]) ly[j]-=min; //
            }
        }
        
int sum=0
        
for(i=1;i<=num_of_home;i++) sum+=map[match[i]][i];
        printf(
"%d\n",sum);  
    }
    
return 0;
}





posted on 2008-11-08 03:28 infinity 閱讀(1104) 評論(0)  編輯 收藏 引用 所屬分類: acm
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            香蕉久久夜色精品| 国产日韩欧美一二三区| 亚洲美女在线视频| 亚洲人成在线播放网站岛国| 欧美高清日韩| 亚洲成人自拍视频| 亚洲经典三级| 亚洲素人在线| 久久精品卡一| 欧美69视频| 欧美三日本三级三级在线播放| 国产精品久久午夜| 国产三级欧美三级日产三级99| 国产亚洲一区在线| 亚洲精品国久久99热| 亚洲一区精彩视频| 久久综合九色综合久99| 91久久亚洲| 香蕉国产精品偷在线观看不卡| 久久亚洲一区二区三区四区| 欧美日韩国产小视频在线观看| 国产精品久久久久久久久久久久久久 | 亚洲一区二区三区精品动漫| 欧美日韩福利视频| 国产精品三级视频| 亚洲成色www8888| 一区二区三区黄色| 久久久蜜桃精品 | 亚洲欧美国产高清va在线播| 久久欧美肥婆一二区| 欧美午夜精品久久久久久浪潮 | 日韩视频欧美视频| 亚洲区中文字幕| 午夜精品福利视频| 最新亚洲视频| 久久午夜视频| 国产毛片一区二区| 一区二区免费在线视频| 美女日韩欧美| 欧美在线免费| 国产精品亚洲成人| 日韩一级在线观看| 欧美国产专区| 久色婷婷小香蕉久久| 国产日韩精品视频一区| 一本久久a久久免费精品不卡| 六月婷婷一区| 久久精品国产久精国产爱| 国产精品免费看久久久香蕉| 中文精品视频| 亚洲黄色视屏| 麻豆91精品| 亚洲国产精品成人综合色在线婷婷| 久久精品国产第一区二区三区最新章节| 亚洲深爱激情| 国产精品国码视频| 亚洲一区3d动漫同人无遮挡| 亚洲伦理一区| 欧美网站在线观看| 亚洲影院色无极综合| 一本一本久久a久久精品综合麻豆| 欧美福利视频网站| 99re热这里只有精品视频| 亚洲人成在线观看| 欧美少妇一区二区| 亚洲欧美综合v| 性欧美大战久久久久久久免费观看| 国产乱理伦片在线观看夜一区 | 亚洲高清av在线| 久热成人在线视频| 日韩午夜电影在线观看| 亚洲精品女av网站| 欧美福利一区| 亚洲图片在线观看| 午夜在线精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲午夜一区二区三区| 欧美日韩在线播放一区| 欧美一区成人| 久久久久久久网| 亚洲靠逼com| 亚洲视频免费观看| 国产亚洲一区精品| 国产精品乱子久久久久| 欧美一区二区高清| 久久一区二区三区国产精品| 亚洲黄网站在线观看| 亚洲狼人精品一区二区三区| 国产精品永久入口久久久| 免费成人av资源网| 欧美日韩国产综合一区二区| 欧美一区二区三区在线免费观看| 久久在线视频在线| 亚洲伊人久久综合| 看片网站欧美日韩| 午夜激情久久久| 欧美a级理论片| 久久er99精品| 欧美日韩国产在线一区| 久久久中精品2020中文| 欧美久久久久久蜜桃| 久久国产精品久久w女人spa| 欧美成人午夜77777| 久久99伊人| 欧美日韩国产亚洲一区| 米奇777超碰欧美日韩亚洲| 欧美日韩视频免费播放| 免费亚洲电影在线| 国产精品日韩高清| 亚洲精品自在在线观看| 在线播放视频一区| 亚洲一区中文字幕在线观看| 亚洲精品乱码久久久久久| 欧美综合国产| 午夜精品免费| 欧美视频精品在线| 亚洲国产成人久久| 激情久久久久久| 亚洲女人天堂成人av在线| 99视频超级精品| 老司机精品久久| 久久婷婷蜜乳一本欲蜜臀| 国产精品www994| 亚洲毛片av在线| 亚洲精品亚洲人成人网| 麻豆av一区二区三区久久| 久久一区免费| 国产日韩视频| 亚洲欧美日韩爽爽影院| 香蕉成人久久| 国产欧美韩日| 亚洲一区欧美一区| 午夜亚洲一区| 国产欧美视频一区二区| 中文精品99久久国产香蕉| 在线视频欧美精品| 欧美日韩黄色大片| 欧美激情第六页| 亚洲一级黄色av| 欧美四级电影网站| 在线一区免费观看| 西西裸体人体做爰大胆久久久| 欧美性猛交一区二区三区精品| 一区二区三区日韩精品| 亚洲欧美久久久| 国产精品主播| 欧美一区二区三区免费在线看| 久久精品国产清自在天天线| 国产亚洲一二三区| 久久亚洲视频| 亚洲精品乱码| 亚洲一区二区三区中文字幕| 国产乱理伦片在线观看夜一区 | 欧美久久久久| 一区二区欧美视频| 欧美一区二区三区在| 狠狠色伊人亚洲综合网站色| 久热精品视频在线观看| 日韩午夜三级在线| 欧美一区二区三区在| 在线激情影院一区| 欧美日韩国产免费观看| 亚洲欧美精品suv| 蜜桃av一区| 亚洲天堂男人| 在线精品亚洲一区二区| 欧美日韩国产精品一卡| 亚洲免费一在线| 欧美成人午夜剧场免费观看| 一区二区不卡在线视频 午夜欧美不卡' | 欧美电影免费观看| 亚洲一区二区三区四区视频 | 国产一区二区三区四区老人| 开心色5月久久精品| 亚洲深夜福利| 免费试看一区| 欧美一区二区三区喷汁尤物| 亚洲国产乱码最新视频| 国产精品久久久久影院亚瑟| 久久一综合视频| 亚洲婷婷综合色高清在线 | 欧美一级播放| 亚洲破处大片| 久久亚洲一区二区三区四区| 亚洲午夜国产成人av电影男同| 伊人久久综合| 国产日韩欧美一区| 欧美日韩一区二区国产| 久久综合伊人77777麻豆| 亚洲欧美国产视频| 一二三区精品| 亚洲国产欧美一区二区三区久久 | 亚洲视频一二三| 亚洲电影免费观看高清完整版| 欧美综合国产| 亚洲一区二区综合| 一本大道久久精品懂色aⅴ| 亚洲第一视频网站| 国语对白精品一区二区| 国产日韩欧美在线播放不卡|