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

隨筆-72  評論-126  文章-0  trackbacks-0
今天學了KM算法,用于二分圖的完美匹配,以前就遇到過很多次,但是一直都沒有花時間去學
學的比較挫,寫的是n^4的算法
實際上有m*m*n的算法的
下邊幾道是完美匹配的題目
http://info.zjfc.edu.cn/acm/problemDetail.aspx?pid=1222 赤裸裸的完美匹配,圖都建好了
http://acm.hdu.edu.cn/showproblem.php?pid=1533 這個建圖很容易
http://acm.hdu.edu.cn/showproblem.php?pid=2282 這個需要建圖

下邊是http://acm.hdu.edu.cn/showproblem.php?pid=1533 的AC代碼
//////////////////////////////////////////////////////////////////////////
//二分圖的完美匹配,Kuhn-Munkras算法
#include<stdio.h>
#include
<math.h>
#include
<string>
#define MAXN 101
//////////////////////////////////////////////////////////////////////////
#define inf 0x7FFFFFFF
int edge[MAXN][MAXN];
int match[MAXN];
bool hash[MAXN][MAXN];
bool xhash[MAXN],yhash[MAXN];
char map[MAXN][MAXN];
int min(int a,int b){return a>b?b:a;}
int max(int a,int b){return a>b?a:b;}
void Scanf(int n,int m,int &l);
bool dfs(int p,int n)//找增廣路徑
{
    
int i;
    
for(i=0;i<n;i++)
    {
        
if(!yhash[i] && hash[p][i])
        {
            yhash[i] 
= true;
            
int t = match[i];
            
if(t == -1 || dfs(t,n))
            {
                match[i] 
= p;
                
return true;
            }
            
if(t != -1)
                xhash[t] 
= true;
        }
    }
    
return false;
}
void show(int id,int n)
{
    
int i,j;
    
for(i=0;i<n;i++)
    {
        
for(j=0;j<n;j++)
        {
            
if(id)
                printf(
"%d ",edge[i][j]);
            
else
                printf(
"%d ",hash[i][j]);
        }
        puts(
"");
    }
    puts(
"");
}
void KM_Perfect_Match(int n)
{
    
int i,j;
    
int xl[MAXN],yl[MAXN];
    
for(i=0;i<n;i++)
    {
        xl[i] 
= 0;
        yl[i] 
= 0;
        
for(j=0;j<n;j++)
            xl[i] 
= max(xl[i],edge[i][j]);
    }
    
bool perfect = false;
    
while(!perfect)
    {
        
for(i=0;i<n;i++)//現(xiàn)階段已經(jīng)匹配的路
        {
            
for(j=0;j<n;j++)
            {
                
if(xl[i] + yl[j] == edge[i][j])
                    hash[i][j] 
= true;
                
else
                    hash[i][j] 
= false;
            }
        }

//        show(0,n);
        int cnt = 0;
        memset(match,
-1,sizeof(match));
        
for(i=0;i<n;i++)//當前的圖是否能全部匹配
        {
            memset(xhash,
false,sizeof(xhash));
            memset(yhash,
false,sizeof(yhash));
            
if(dfs(i,n))
                cnt 
++;
            
else
            {
                xhash[i] 
= true;
                
break;
            }
        }
        
if(cnt == n)//沒有增廣路徑
            perfect = true;
        
else
        {
            
int ex = inf;
            
for(i=0;i<n;i++)
            {
                
for(j=0;xhash[i] && j<n;j++)
                {
                    
if(!yhash[j])
                        ex 
= min(ex,xl[i] + yl[j] - edge[i][j]);//找到一條沒建的邊的最小值
                }
            }
            
for(i=0;i<n;i++)//根據(jù)這個邊來進行松弛
            {
                
if(xhash[i])
                    xl[i] 
-= ex;
                
if(yhash[i])
                    yl[i] 
+= ex;
            }
        }
    }
}
int main()
{
    
int n,m,l;
    
while(scanf("%d%d",&n,&m))
    {
        
if(n == 0 && m == 0)
            
break;
        Scanf(n,m,l);
        KM_Perfect_Match(l);
        
int mindis = 0;
        
for(int i=0;i<l;i++)
            mindis 
+= edge[match[i]][i];
        printf(
"%d\n",-mindis);
    }
    
return 0;
}

//讀入建圖
void Scanf(int n,int m,int &l)
{
    
int i,j,l1,l2;
    
struct Point{
        
int x,y;
    }MAN[MAXN],HOUSE[MAXN];
    l1 
= l2 = 0;
    
for(i=0;i<n;i++)
    {
        scanf(
"%s",map[i]);
        
for(j=0;j<m;j++)
        {
            
if(map[i][j]=='m')
            {
                MAN[l1].x 
= i;
                MAN[l1].y 
= j;
                l1 
++;
            }
            
else if(map[i][j]=='H')
            {
                HOUSE[l2].x 
= i;
                HOUSE[l2].y 
= j;
                l2 
++;
            }
        }
    }
    l 
= l1;
    
for(i=0;i<l;i++)
        
for(j=0;j<l;j++)
            edge[i][j] 
= -abs(MAN[i].x - HOUSE[j].x) - abs(MAN[i].y - HOUSE[j].y);
}

posted on 2009-04-21 14:32 shǎ崽 閱讀(1775) 評論(2)  編輯 收藏 引用

評論:
# re: 二分圖的完美匹配 2009-04-24 18:48 | wswyb001
好長啊,還沒有學KM  回復  更多評論
  
# re: 二分圖的完美匹配 2009-04-28 14:42 | shǎ崽
@wswyb001
這個是n^4的算法
浙大模板n^3的,現(xiàn)在用那個。。。  回復  更多評論
  

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲无线视频| 亚洲欧美日本另类| 亚洲欧美精品在线观看| 亚洲人成网在线播放| 亚洲激情视频网站| 亚洲精品视频在线观看免费| 亚洲国产岛国毛片在线| 亚洲国产精品一区制服丝袜| 亚洲高清一区二| 亚洲精品日韩精品| 亚洲视频在线播放| 久久精品国产v日韩v亚洲| 久久噜噜噜精品国产亚洲综合| 久久综合狠狠| 亚洲精品一二三| 亚洲在线观看免费| 狼人社综合社区| 欧美日韩和欧美的一区二区| 国产精品一区免费观看| 亚洲丰满在线| 亚洲一二三四久久| 久久免费少妇高潮久久精品99| 欧美**人妖| 99视频一区二区三区| 小黄鸭精品aⅴ导航网站入口| 久久亚洲一区二区| 国产精品久久久久久久7电影| 好吊视频一区二区三区四区| 99re6这里只有精品视频在线观看| 亚洲——在线| 亚洲盗摄视频| 亚洲女人天堂av| 欧美激情中文不卡| 狠狠入ady亚洲精品经典电影| 亚洲午夜高清视频| 亚洲国产精品精华液网站| 亚洲欧美成人网| 国产精品r级在线| 日韩一级黄色片| 欧美国产日韩xxxxx| 午夜一级在线看亚洲| 欧美日韩一区视频| 亚洲人www| 欧美二区在线播放| 久久精品在线免费观看| 国产欧美一区二区精品性| 在线亚洲精品福利网址导航| 欧美bbbxxxxx| 久久国产色av| 国产视频不卡| 欧美在线视频日韩| 亚洲午夜影视影院在线观看| 欧美精品成人91久久久久久久| 国内精品亚洲| 久久先锋资源| 久久久青草青青国产亚洲免观| 亚洲国产天堂久久综合网| 国产日韩欧美视频| 先锋影音久久| 亚洲制服少妇| 国产精品亚洲综合天堂夜夜| 中文av一区特黄| 999亚洲国产精| 欧美人成在线| 亚洲天堂网在线观看| 99国产精品视频免费观看一公开 | 一区二区不卡在线视频 午夜欧美不卡在 | 欧美成人久久| 久久久99国产精品免费| 国产欧美日韩精品在线| 欧美一区二区三区男人的天堂| 亚洲图片欧美日产| 国产视频自拍一区| 久久综合精品国产一区二区三区| 午夜国产精品影院在线观看| 国产欧美午夜| 卡一卡二国产精品| 蜜桃久久av| 中文精品视频一区二区在线观看| 亚洲老司机av| 国产精品久久久久久一区二区三区| 亚洲图片你懂的| 亚洲综合精品自拍| 国产亚洲欧美激情| 欧美~级网站不卡| 欧美精品成人一区二区在线观看 | 在线天堂一区av电影| 亚洲色图在线视频| 国内外成人免费激情在线视频| 欧美v日韩v国产v| 欧美日韩精品综合在线| 欧美一区二区三区免费看| 久久久久国产精品厨房| 亚洲人成网站777色婷婷| 一卡二卡3卡四卡高清精品视频| 国产日韩欧美亚洲| 91久久国产精品91久久性色| 国产精品久久久亚洲一区 | 欧美激情一区二区久久久| 欧美日韩在线三区| 久久免费黄色| 欧美日韩视频一区二区| 久久久噜噜噜久久久| 欧美激情一区二区三区在线| 亚洲欧美日韩在线一区| 国产亚洲欧美日韩日本| 亚洲欧美日韩天堂| 老司机精品视频网站| 亚洲一区免费| 免费亚洲一区| 久久精品视频在线| 欧美亚洲第一区| 欧美大片免费| 国产亚洲欧美一区| 日韩一级二级三级| 亚洲国产一区二区三区青草影视 | 美女诱惑黄网站一区| 亚洲欧美日韩精品久久亚洲区| 你懂的亚洲视频| 麻豆国产精品一区二区三区 | 国产精品亚洲а∨天堂免在线| 欧美国产日韩精品| 精品999在线观看| 午夜久久久久久| 亚洲欧美www| 欧美日韩一区二区视频在线| 欧美国产三级| 狠狠色狠狠色综合人人| 亚洲欧美日本视频在线观看| 亚洲免费黄色| 欧美成人免费在线视频| 久久一区二区三区四区| 国产日韩欧美一区二区三区四区| 一区二区高清在线| 在线视频亚洲欧美| 欧美人与禽性xxxxx杂性| 欧美成人午夜免费视在线看片| 国产亚洲成av人在线观看导航 | 翔田千里一区二区| 欧美国产专区| 久久综合中文字幕| 国产日韩在线播放| 亚洲欧美国产精品桃花| 亚洲国产高潮在线观看| 欧美+日本+国产+在线a∨观看| 欧美成人精品福利| 日韩视频中文字幕| 欧美视频一区二区| 亚洲免费视频观看| 久久欧美中文字幕| 亚洲高清在线| 欧美日韩一区二区视频在线| 亚洲婷婷免费| 国产亚洲高清视频| 久久亚洲精选| 亚洲电影毛片| 亚洲自拍偷拍福利| 国产欧美在线视频| 久久五月激情| 亚洲精品久久久久久下一站 | 女生裸体视频一区二区三区| 亚洲盗摄视频| 欧美激情亚洲国产| 亚洲午夜av在线| 久久久91精品国产一区二区三区| 亚洲欧美在线免费观看| 午夜亚洲精品| 老司机一区二区| 亚洲全部视频| 国产精品一区二区久久| 欧美一区二区三区四区高清| 久久精品系列| 野花国产精品入口| 久久精品国产免费| 亚洲精品小视频在线观看| 欧美国产综合| 亚洲欧美日韩人成在线播放| 欧美影院视频| 亚洲日本va午夜在线影院| 欧美日韩在线精品| 久久激情婷婷| 艳女tv在线观看国产一区| 亚洲综合国产激情另类一区| 国产亚洲欧美一区在线观看 | 欧美激情一区在线观看| 亚洲一区中文| 影音先锋久久| 国产精品久久国产愉拍| 鲁鲁狠狠狠7777一区二区| 亚洲素人在线| 欧美激情亚洲激情| 久久国产乱子精品免费女| 亚洲精品中文字幕女同| 一区二区视频欧美| 国产欧美日韩视频一区二区| 欧美连裤袜在线视频| 欧美aⅴ99久久黑人专区| 久久久噜噜噜| 久久国内精品视频| 欧美在线日韩|