先%dalao部落格
建圖並沒有什麼難的,但是關鍵在於如何使字典序最小。
乙個很顯然的想法是先求出乙個完美匹配,然後從x集合的第乙個元素開始,如果該元素匹配的較小的乙個,那麼繼續,如果是較小的乙個,那麼強制把它轉換成較小的乙個,然後在其之後,尋找增廣路,如果能找到的話,就修改,如果沒有,取消修改。
然而這樣的時間複雜度比較高,我們可以採取一種比較高效的貪心。
倒著匹配
即從x集合的最後乙個元素開始匹配,最後得到的就是字典序最小的。
那麼為什麼這樣是對的呢?
我們可以發現,總有一些匹配確定的,那麼除去這些匹配,剩下的就是一些環,從後往前匹配,可以達到最優
#include #include #include #include #include using namespace std;
int init()
while(c>='0'&&c<='9')
return rv*fh;
}int n,g[10005][2],match[10005];
bool f[10005];
bool hungarian(int u)
} }return 0;
}int main()
if(ans==n)
for(int i=0;i}else printf("no answer\n");
return 0;
}
洛谷P1963 變換序列
題目大意 對於乙個順序序列,求乙個合法置換,可以滿足一些約束,若存在多個合法置換,則輸出字典序最小的乙個置換。題解 對於序列的置換是否有解的問題,可以和二分圖的完美匹配相關聯。由於是字典序最小,顯然需要貪心考慮。在匈牙利演算法執行的過程中,對於每個點來說,可以優先匹配符合條件的最小的點 對於左邊點集...
洛谷P1758 NOI2009 管道取珠
題目 管道取珠是小x很喜歡的一款遊戲。在本題中,我們將考慮該遊戲的乙個簡單改版。遊戲畫面如圖1所示 圖1 遊戲初始時,左側上下兩個管道分別有一定數量的小球 有深色球和淺色球兩種型別 而右側輸出管道為空。每一次操作,可以從左側選擇乙個管道,並將該管道中最右側的球推入右邊輸出管道。例如 我們首先從下管道...
洛谷 P4159 SCOI2009 迷路
如果邊權為 1 11,則是簡單的矩陣快速冪加速dp遞推方程,又因為邊權並不大,所以考慮拆點,新圖中邊權均為 1 11,將每個點暴力拆成相連的 9 99 個點,對於原先某條邊 u,v,w u,v,w u,v,w 可以轉化為 u uu 拆成的點中第 w ww 個連向 v vv 拆成的點中第 1 11 個...