二分匹配之最大權值匹配算法---KM模板

百科:http://baike.baidu.com/link?url=vbM3H4XmfrsWfP-epdlR2sVKSNzOq4hXnWDqm5uo8fd7VWsF2SmhDV35XyVUDvVjvrtf42RUITJuNCHn-7_x6K

大神總結:http://www.cnblogs.com/skyming/archive/2012/02/18/2356919.html

代碼:

 1 #include<stdio.h>
 2 #include<string.h>
 3 const int N=555,INF=0x3f3f3f3f;
 4 int lx[N],ly[N],vx[N],vy[N],slack[N],match[N];
 5 int a[N][N];
 6 int nx,ny;
 7 int dfs(int u)
 8 {
 9     vx[u]=1;
10     for(int i=1;i<=ny;i++)
11     {
12         if(vy[i])    continue;
13         int t=lx[u]+ly[i]-a[u][i];
14         if(t==0)
15         {
16             vy[i]=1;
17             if(match[i]==-1||dfs(match[i]))
18             {
19                 match[i]=u;
20                 return 1;
21             }
22         }
23         else if(slack[i]>t)
24             slack[i]=t;
25     }
26     return 0;
27 }
28 int KM()
29 {
30     int i,j,d;
31     memset(ly,0,sizeof(ly));
32     memset(match,-1,sizeof(match));
33     for(i=1,lx[i]=-INF;i<=nx;i++)
34         for(j=1;j<=ny;j++)
35             if(a[i][j]>lx[i])
36                 lx[i]=a[i][j];
37     for(i=1;i<=nx;i++)
38     {
39         memset(slack,0x3f,sizeof(slack));
40         while(1)
41         {
42             memset(vx,0,sizeof(vx));
43             memset(vy,0,sizeof(vy));
44             if(dfs(i))    break;
45             d=INF;
46             for(j=1;j<=ny;j++)
47                 if(!vy[j]&&slack[j]<d)
48                     d=slack[j];
49             //if(d==INF)    break;//該點找不到任何匹配 
50             for(j=1;j<=nx;j++)
51                 if(vx[j])
52                     lx[j]-=d;
53             for(j=1;j<=ny;j++)
54             {
55                 if(vy[j])
56                     ly[j]+=d;
57                 else
58                     slack[j]-=d;
59             }
60         }
61     }
62     int ans=0,sum=0;
63     for(i=1;i<=ny;i++)
64         if(match[i]>-1&&a[match[i]][i])
65             ans+=a[match[i]][i],sum++; 
66     printf("%d++\n",sum);//匹配數 
67     return ans;
68 }
69 int main()
70 {
71     int m,u,v,w,n,i;
72     scanf("%d",&nx);
73     scanf("%d",&ny);
74     scanf("%d",&m);
75     memset(a,0,sizeof(a));
76     while(m--)
77     {
78         scanf("%d%d%d",&u,&v,&w);
79         a[u][v]=a[v][u]=w;
80     }
81     printf("%d\n",KM());
82     return 0;
83 }

?

轉載于:https://www.cnblogs.com/L-King/p/5519927.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372862.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java實現報表_用存儲過程和 JAVA 寫報表數據源有什么弊端?

用存儲過程和 JAVA 寫報表數據源有什么弊端&#xff1f;跟著小編一起來一看一下吧&#xff01;我們在報表開發中經常會使用存儲過程準備數據&#xff0c;存儲過程支持分步計算&#xff0c;可以實現非常復雜的計算邏輯&#xff0c;為報表開發帶來便利。所以&#xff0c;報表開發…

SpringMVC學習筆記整理

SpringMVC學習筆記 以下是我整理的SpringMVC學習筆記&#xff1a; 導入jar包 一&#xff1a;springmvc工作流程。 ①. servlet容器初始化一個request請求 ②. DispatcherServlet分發器負責發送請求到映射器. ③. despatcherServlet把請求交給處理器映射Mapping&…

Java EE重新審視設計模式:異步

盡管您可能找不到作為設計模式列出的異步方法調用&#xff0c;但我還是值得一提。 因此&#xff0c;這是我的JavaEE Revisits設計模式系列的最后一篇文章。 異步方法調用只不過是多線程。 基本上&#xff0c;它是指將在單獨的線程中運行的方法調用&#xff0c;因此主&#xff0…

am335x watchdog

am335x watchdog 內核文檔kernel/Documentation/watchdog Qtaplex:~/kernel/7109/linux-3.2.0/Documentation/watchdog$ ll total 88 drwxrwxr-x 3 Qt Qt 4096 Jun 8 15:11 ./ drwxrwxr-x 94 Qt Qt 12288 Apr 28 13:09 ../ -rwxrwxr-x 1 Qt Qt 576 Nov 20 2013 00-INDEX -rwxrw…

springboot2 使用hikaridatasource 并測試_基于Spring Boot 2.x的后端管理網站腳手,源碼免費分享...

基于Spring Boot 2.x 的 Material Design 的后端管理網站腳手架 &#xff1a;提供權限認證 用戶管理 菜單管理 操作日志 等常用功能去繁就簡 重新出發基于Spring Boot 集成一些常用的功能&#xff0c;你只需要基于它做些簡單的修改即可。功能列表&#xff1a;權限認證權限管理用…

測試驅動開發–雙贏策略

敏捷從業人員談論測試驅動開發 &#xff08;TDD&#xff09;&#xff0c;所以許多關心代碼質量和可操作性的開發人員也是如此。 我曾幾何時&#xff0c;不久前設法閱讀了有關TDD的文章。 據我了解&#xff0c;TDD的關鍵是&#xff1a; 編寫測試&#xff0c;但失敗 代碼&#x…

設計模式學習(三)——裝飾器模式

前言 距離上一次正兒八經地寫隨筆已經有一段時間了&#xff0c;雖然2月10號有一篇關于泛型的小記&#xff0c;但是其實只是簡單地將自己的學習代碼貼上來&#xff0c;為了方便后續使用時查閱&#xff0c;并沒有多少文字和理解感悟。之所以在今天覺得有必要寫點東西&#xff0c;…

swift - 導航欄設置

話不多&#xff0c;直接貼代碼&#xff1a; let nav UINavigationController.init(rootViewController: viewController) nav.topViewController?.title title// 設置導航欄的標題 nav.navigationBar.tintColor .whiteColor()// 設置push出的導航欄的返回顏色(箭頭及文字) …

mysql5.6主從復制(讀寫分離)方案_MySQL5.6主從復制(讀寫分離)方案

MySQL5.6主從復制(讀寫分離)方案一、前言&#xff1a;為什么MySQL要做主從復制(讀寫分離)&#xff1f;通俗來講&#xff0c;如果對數據庫的讀和寫都在同一個數據庫服務器中操作&#xff0c;業務系統性能會降低。為了提升業務系統性能&#xff0c;優化用戶體驗&#xff0c;可以通…

在實踐中使用延遲隊列

通常&#xff0c;在某些情況下&#xff0c;當您有某種工作或作業隊列時&#xff0c;有必要不立即處理每個工作項或作業&#xff0c;而是要延遲一些時間。 例如&#xff0c;如果用戶單擊一個按鈕來觸發要完成的某項工作&#xff0c;而一秒鐘后&#xff0c;用戶意識到他/她錯了&a…

PCL學習八叉樹

建立空間索引在點云數據處理中有著廣泛的應用&#xff0c;常見的空間索引一般 是自頂而下逐級劃分空間的各種空間索引結構&#xff0c;比較有代表性的包括BSP樹&#xff0c;KD樹&#xff0c;KDB樹&#xff0c;R樹&#xff0c;四叉樹&#xff0c;八叉樹等索引結構&#xff0c;而…

Android實現自定義帶文字和圖片的Button

在Android開發中經常會需要用到帶文字和圖片的button&#xff0c;下面來講解一下常用的實現辦法。 一.用系統自帶的Button實現 最簡單的一種辦法就是利用系統自帶的Button來實現&#xff0c;這種方式代碼量最小。在Button的屬性中有一個是drawableLeft&#xff0c;這個 屬性可以…

mysql語句中的注釋方法_MySQL語句注釋方式簡介

MySQL支持三種注釋方式&#xff1a;1.從‘#字符從行尾。2.從‘-- 序列到行尾。請注意‘-- (雙破折號)注釋風格要求第2個破折號后面至少跟一個空格符(例如空格、tab、換行符等等)。3.從/*序列到后面的*/序列。結束序列不一定在同一行中&#xff0c;因此該語法允許注釋跨越多行。…

aqlserver實用程序_sqlserver命令提示實用工具的介紹

除上述的圖形化管理工具外&#xff0c;SQL Server2008還提供了大量的命令行實用工具&#xff0c;包括bcp、dtexec、dtutil、osql、reconfig、sqlcmd、sqlwb和tablediff等&#xff0c;下面進行簡要說明。dtexec實用工具用于配置和執行SQL Server2008 Intgration Services包。用戶…

使用Java和Scala將Play Framework 2應用程序部署到Openshift

幾個星期&#xff0c; 馬克阿特伍德 &#xff08; Mark Atwood&#xff09; &#xff0c; 豪爾赫阿里斯 &#xff08; Jorge Aliss &#xff09;和我塞巴斯蒂安 斯卡塔諾 &#xff08; SebastinScarano&#xff09;參加了紅帽網絡研討會LETS PLAY&#xff01; 在云端&#xff1…

LintCode 387: Smallest Difference

LintCode 387: Smallest Difference 題目描述 給定兩個整數數組&#xff08;第一個是數組A&#xff0c;第二個是數組B&#xff09;&#xff0c;在數組A中取A[i]&#xff0c;數組B中取B[j]&#xff0c;A[i]和B[j]兩者的差越小越好(|A[i] - B[j]|)。返回最小差。 樣例 給定數組A …

android框架----下沉文字Titanic的使用

Titanic is a simple illusion obtained by applying an animated translation on the TextView TextPaint Shaders matrix. Titanic的使用 Titanic的使用&#xff0c;項目結構如下&#xff1a; 一、下載Titanic并且部署到項目中 Titanic的項目地址&#xff1a; https://github…

linux 自動安裝mysql_Linux安裝mysql

一、下載這里我創建了一目錄software用于存放我們待會要下載的mysql包&#xff0c;先去到該目錄命令&#xff1a;cd /software命令&#xff1a;wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar下載完成后&#xff0c;你會在software這個…

Quartz Scheduler插件–隱藏的寶藏

盡管在官方文檔中進行了簡要描述&#xff0c;但我相信Quartz插件了解得還不夠多&#xff0c;看看它們有多有用。 本質上&#xff0c;Quartz中的插件是方便的類&#xff0c;用于包裝基礎偵聽器的注冊。 您可以自由編寫自己的插件&#xff0c;但我們將專注于Quartz隨附的現有插件…

mysql查詢表名匹配只有字母的_MySQL按某些匹配字母查詢表

MySQL查詢是MySQL的核心功能&#xff0c;有時候我們需要查找帶有某些匹配字母的表。下文對該MySQL查詢方式作了詳細的介紹&#xff0c;供您參考。在MySQL中我們可以使用LIKE或者NOT LIKE操作符進行比較。在MySQL中模式默認是不區分大小寫的。查詢示例&#xff0c;student表----…