#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 ...