有乙個展廳,裡面有一些文物和守衛,現在守衛不夠,需要再僱傭一些守衛使所有文物被保護,且僱傭數量要最少,求這個數量。
文物被保護的定義:這個文物的所有必須被保護的點都要有守衛。
乙個文物由乙個2的12次方以內的數表示,那麼這個數最多有12位,對應圖中給出打的12個可能要被保護的點。
從末位(i=0 to 11)開始,當i為1,則對應圖中12個點中的第(i+1)個點必須被保護。
構圖:我們遍歷每個文物,求出每個文物的必須被保護的點,向這個點與其對應的文物之間加邊。
顯然,當圖中每條邊至少有乙個點是有守衛的點,那麼此時所有文物都被保護了。這便是求乙個二分圖的最小點覆蓋,也即最大匹配數。
細節:此題用鄰接矩陣可能會超時或爆記憶體。可用鄰接表。
1 #include2 #include3 #include4using
namespace
std;
5int
n,m;
6int dx[12]= ;
7int dy[12]= ;
8int a[60][60],linker[3600],vis[3600
];9 vector v[2550
];10
bool dfs(int
u)1124}
25}26return
false;27
}28intmain()
2958}59
}60}61
}62}63 memset(linker,-1,sizeof
(linker));
64int u,ret=0;65
for(u=0;u)
6670 printf("
%d. %d\n
",++numcas,ret/2
);71}72
return0;
73 }
二分匹配 匈牙利演算法
這個演算法真心很精妙,其實 很簡單,但是理解其中的奧秘還真要花點時間 matrix67大牛說的好 說穿了,就是你從二分圖中找出一條路徑來,讓路徑的起點和終點都是還沒有匹配過的點,並且路徑經過的連線是一條沒被匹配 一條已經匹配過,再下一條又沒匹配這樣交替地出現。找到這樣的路徑後,顯然路徑裡沒被匹配的連...
二分匹配 匈牙利演算法
奆佬的部落格 匈牙利演算法是由匈牙利數學家edmonds於1965年提出,因而得名。匈牙利演算法是基於hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹配的演算法。等等,看得頭大?那麼請看下面的版本 通過數代人的努力,你終於趕...
HDU 1151 二分匹配 匈牙利演算法
二分匹配 匈牙利演算法 根據 dag圖的最小路徑覆蓋數 節點數 n 最大匹配數 m 先用匈牙利演算法求出最大匹配數,再用它減去節點數就可以了 include includeusing namespace std const int n 125 int map n n vis1 n vis2 n fl...