日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图论,匈牙利算法

發布時間:2024/10/12 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图论,匈牙利算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匈牙利算法

?USACO 4.2.2 The Perfect Stall 完美的牛欄

這是一種用增廣路求二分圖最大匹配的算法。它由匈牙利數學家Edmonds于1965年提出,因而得名。 定義 未蓋點:設Vi是圖G的一個頂點,如果Vi 不與任意一條屬于匹配M的邊相關聯,就稱Vi 是一個未蓋點。

交錯路:設P是圖G的一條路,如果P的任意兩條相鄰的邊一定是一條屬于M而另一條不屬于M,就稱P是一條交錯路。

可增廣路:兩個端點都是未蓋點的交錯路叫做可增廣路。?

流程圖

偽代碼:

bool 尋找從k出發的對應項出的可增廣路 {while (從鄰接表中列舉k能關聯到頂點j){if (j不在增廣路上){把j加入增廣路;if (j是未蓋點 或者 從j的對應項出發有可增廣路){修改j的對應項為k;則從k的對應項出有可增廣路,返回true;}}}則從k的對應項出沒有可增廣路,返回false; }void 匈牙利hungary() {for i->1 to n{if (則從i的對應項出有可增廣路)匹配數++;}輸出 匹配數; }

演示

C實現

#include <stdio.h> #include <string.h> #define MAX 102long n,n1,match; long adjl[MAX][MAX]; long mat[MAX]; bool used[MAX];FILE *fi,*fo;void readfile() {fi=fopen("flyer.in","r");fo=fopen("flyer.out","w");fscanf(fi,"%ld%ld",&n,&n1);long a,b;while (fscanf(fi,"%ld%ld",&a,&b)!=EOF)adjl[a][ ++adjl[a][0] ]=b;match=0; }bool crosspath(long k) {for (long i=1;i<=adjl[k][0];i++){long j=adjl[k][i];if (!used[j]){used[j]=true;if (mat[j]==0 || crosspath(mat[j])){mat[j]=k;return true;}}}return false; }void hungary() {for (long i=1;i<=n1;i++){if (crosspath(i))match++;memset(used,0,sizeof(used));} }void print() {fprintf(fo,"%ld",match);fclose(fi);fclose(fo); }int main() {readfile();hungary();print();return 0; }

轉載于:https://www.cnblogs.com/tham/p/6827412.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的图论,匈牙利算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。