板子 KM(n3板子)

2021-10-01 22:39:08 字數 1391 閱讀 3890

#include using namespace std;

#define ll long long

//演算法使用

//w[maxn][maxn] 陣列表示圖的鄰接矩陣

//pop表示二分圖的左右兩邊的點的數量

//點從0到n-1

//const int maxn = 50;

const int inf = 0x3f3f3f3f;

int w[maxn][maxn], x[maxn], y[maxn];

int pre_x[maxn], pre_y[maxn], son_y[maxn], slack[maxn], par[maxn];

int lx, ly, pop;

void adjust(int v)

}bool find(int v)

//說明可以向這個方向深搜

if (x[v] + y[i] == w[v][i])

//如果yi對於的匹配邊另一端的xson節點已經出現在了增廣路上,這條增廣路不可用,去找下乙個y節點

if (pre_x[son_y[i]] != -1)

//如果yi對於的匹配邊另一端的xson節點沒有出現在增廣路上,下乙個可以去跑xson節點,同時把xson節點指向yi節點

pre_x[son_y[i]] = i;

//建立了xv-yi-xson的增廣後,去查詢xson的迴圈

if (find(son_y[i]))

return true;}}

}return false;

}ll km()

//給每個i節點尋找期望x[i]

for (int i = 0; i < pop; i++)

}bool flag;

//pop遍迴圈,每次迴圈為xi節點尋找對應的匹配

for (int i = 0; i < pop; i++)

//設定xi節點為起點

pre_x[i] = -2;

//跑dfs找增廣路

if (find(i))

continue;

//找不到增廣路,所以需要修改期望

flag = false;

while (!flag)

//迴圈找到slack降低m後為0的值,這些值就是在上一次find中一次都沒有被匹配到的節點

//沒有降到0的就不用跑了

for (int j = 0; j < pop; j++)

pre_x[son_y[j]] = j;

if (find(son_y[j]))}}

}}

ll ans = 0;

for (int i = 0; i < pop; i++)

return ans;

}

KMP板子 Trie板子

kmp演算法是乙個字串匹配演算法,最直白的用法就是在乙個長度為n的字串t中查詢另乙個長度為m字串p的匹配 總之就是用於文字中進行單個字串的匹配 對於這個問題,暴力演算法是很好做的,直接對於t的每個位置判斷一下當前位置作為p的結尾是否可以匹配成功,演算法複雜度是o nm kmp演算法的主要思想是 假設...

c 大數板子

include include include include using namespace std typedef long long ll 完全大數模板 輸出cin a 輸出a.print 注意這個輸入不能自動去掉前導0的,可以先讀入到char陣列,去掉前導0,再用建構函式。by kuangb...

KM演算法板子

原題hdu2255 其實在求最大 最小的時候只要用乙個模板就行了,把邊的權值去相反數即可得到另外乙個.求結果的時候再去相反數即可 最大最小有一些地方不同。include include include include 赤裸裸的模板啊。const int maxn 301 const int inf ...