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

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 閱讀(1115) 評論(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>
            久久精品成人一区二区三区| 亚洲欧美综合一区| 麻豆精品在线播放| 久久久精品一区| 亚洲第一福利视频| 91久久精品国产91久久| 欧美a级一区| 中文日韩电影网站| 午夜国产欧美理论在线播放| 国产一区二区毛片| 免费亚洲婷婷| 欧美日本成人| 亚洲欧美日韩综合aⅴ视频| 亚洲女性喷水在线观看一区| 国模叶桐国产精品一区| 欧美激情黄色片| 欧美四级伦理在线| 久久精品理论片| 久热综合在线亚洲精品| 亚洲午夜成aⅴ人片| 亚洲欧美中文日韩在线| 亚洲高清在线精品| 91久久久久久久久| 国产伦精品一区二区三| 欧美成人国产va精品日本一级| 欧美精选一区| 欧美专区第一页| 欧美成人免费全部| 欧美怡红院视频| 欧美国产精品v| 久久精品国产综合| 欧美日韩免费看| 久久综合久久综合久久综合| 欧美另类视频| 免费日韩成人| 国产欧美日韩视频一区二区| 亚洲国产1区| 国内成人在线| 亚洲性xxxx| 亚洲精品国产拍免费91在线| 亚洲免费在线播放| 一区二区三区高清视频在线观看| 欧美中文字幕在线观看| 亚洲一区二区网站| 蜜桃av噜噜一区| 久久久精品午夜少妇| 欧美精品激情blacked18| 国产一区二区精品久久91| 美女主播视频一区| 国产精品久久国产精品99gif| 欧美国产精品久久| 狠狠色丁香婷婷综合久久片| 一区二区三区视频免费在线观看| 亚洲国内自拍| 久久综合狠狠综合久久综青草| 性欧美大战久久久久久久免费观看 | 亚洲第一精品夜夜躁人人躁| 亚洲欧美综合一区| 性做久久久久久免费观看欧美| 欧美激情综合网| 亚洲高清一区二| 伊人成人在线| 欧美中文字幕在线观看| 久久精品国产精品亚洲| 国产伦精品一区| 亚洲欧美春色| 久久国产精品毛片| 国产日韩专区| 欧美在线网址| 久久夜色精品国产噜噜av| 国产亚洲一区二区精品| 欧美一区激情视频在线观看| 久久久久成人精品免费播放动漫| 国产欧美综合在线| 久久精品视频免费播放| 欧美1区视频| 亚洲精品免费在线播放| 欧美—级在线免费片| 亚洲精品国产日韩| 亚洲女人天堂成人av在线| 国产精品青草综合久久久久99 | 久久精品噜噜噜成人av农村| 国产美女一区二区| 久久国产手机看片| 欧美a级一区二区| 日韩亚洲视频在线| 国产精品久久久亚洲一区| 欧美一区二区播放| 免费在线看一区| 日韩视频在线永久播放| 欧美性开放视频| 午夜精品久久久久久久99水蜜桃 | 99精品国产福利在线观看免费| 欧美激情一区二区三区在线视频观看| 亚洲福利电影| 午夜精品久久久久久久99黑人| 国产精品亚洲美女av网站| 久久精品系列| 99国内精品| 美女国内精品自产拍在线播放| 亚洲电影在线看| 欧美视频中文字幕| 久久乐国产精品| 一区二区冒白浆视频| 老色鬼久久亚洲一区二区| 亚洲精品小视频| 国产视频一区二区在线观看 | 欧美在线观看视频| 亚洲乱码精品一二三四区日韩在线 | 亚洲自拍都市欧美小说| 依依成人综合视频| 欧美激情一区二区三区在线视频观看 | 一区二区三区高清视频在线观看| 久久国产精品电影| 亚洲天天影视| 亚洲夫妻自拍| 国产一区二区三区久久悠悠色av| 欧美日产一区二区三区在线观看| 欧美一区二区在线视频| 99国内精品久久久久久久软件| 每日更新成人在线视频| 性伦欧美刺激片在线观看| 亚洲美女在线国产| 亚洲高清久久| 黑人一区二区三区四区五区| 欧美网站在线观看| 欧美顶级大胆免费视频| 久久久久久网址| 欧美一级视频| 亚洲一区免费视频| 亚洲视屏在线播放| 999在线观看精品免费不卡网站| 欧美国产精品专区| 久热re这里精品视频在线6| 羞羞答答国产精品www一本| 日韩一级精品视频在线观看| 亚洲第一福利视频| 在线欧美小视频| 1024亚洲| 亚洲第一网站| 在线精品亚洲| 尤物yw午夜国产精品视频| 国产一区二区中文| 国产亚洲精品高潮| 国产一区二区精品久久99| 国产亚洲欧美中文| 国产一区二区视频在线观看| 国产性天天综合网| 国语精品中文字幕| 精品动漫3d一区二区三区免费| 国产在线一区二区三区四区| 国产日韩欧美三级| 国产主播在线一区| 一区免费观看| 亚洲国产综合视频在线观看| 亚洲精品久久久久久久久久久久 | 一区二区福利| 亚洲一区免费在线观看| 亚洲欧美久久| 久久精品免费| 免费在线亚洲欧美| 亚洲高清自拍| 一区二区三区产品免费精品久久75 | 亚洲高清网站| 9久草视频在线视频精品| 亚洲一区二区三区四区在线观看| 欧美一区二区啪啪| 蜜臀久久99精品久久久画质超高清| 六月丁香综合| 国产精品成人免费视频| 国产视频一区三区| 亚洲人午夜精品免费| 亚洲综合视频一区| 美女网站久久| 日韩视频免费在线| 久久不射2019中文字幕| 欧美国产日韩一区| 国产精品丝袜久久久久久app | 美女精品在线| 国产精品二区二区三区| 国产一区二区三区黄视频| 亚洲美女在线看| 欧美在线观看视频在线| 欧美激情二区三区| 亚洲欧洲av一区二区| 欧美成人在线免费视频| 国产欧美一区二区三区久久人妖| 一区精品在线播放| 亚洲欧美国产日韩天堂区| 欧美大片在线看| 亚洲欧美日产图| 欧美精品一区二区视频| 国产一区二区三区在线观看精品| 99国产精品久久久久久久久久 | 亚洲第一狼人社区| 午夜欧美不卡精品aaaaa| 欧美激情第五页| 国内成+人亚洲+欧美+综合在线| 一个色综合导航| 亚洲第一毛片|