模板 KM演算法

2022-06-08 15:30:09 字數 1396 閱讀 7713

\(km\)演算法計算帶權二分圖最優匹配

模板一:\(dfs\)演算法,時間複雜度\(o(n^4)\)

const int maxn=310;

const ll inf=0x3f3f3f3f3f3f3f3f;

//match[i]=j表示右邊的第i個點匹配左邊的第j個點,也可能這兩個點之間其實沒有連邊,也就是權值為零

int n,match[maxn];

ll g[maxn][maxn],ex1[maxn],ex2[maxn],slack[maxn];

bool vis1[maxn],vis2[maxn];

bool dfs(int x)

} else

}return false;

}ll km()

}for(int i=1;i<=n;i++)}}

ll res=0;

for(int i=1;i<=n;i++)

res+=g[match[i]][i];

return res;

}

模板題:hdu2255 奔小康賺大錢

模板二:\(bfs\)演算法,時間複雜度\(o(n^3)\)

#include#define ll long long

#define pii pairusing namespace std;

const int maxn=410;

const ll inf=0x3f3f3f3f3f3f3f3f;

int n,m,e;

int link_x[maxn],link_y[maxn];

int que[maxn<<1],top,fail,pre[maxn];

ll g[maxn][maxn],hx[maxn],hy[maxn],slk[maxn];

bool visx[maxn],visy[maxn];

void init()

for(int i=1;i<=n;i++)}}

d=inf;

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

}}

int main()

init();

for(int i=1;i<=n;i++) bfs(i);

ll ans=0;

for(int i=1;i<=nn;i++) ans+=g[i][link_x[i]];

printf("%lld\n",ans);

for(int i=1;iif(g[nn][link_x[nn]]==0) link_x[nn]=0;

printf("%d\n",link_x[nn]);

}

KM演算法模板

這是hdu2255 include include include include includeusing namespace std const int maxn 305 const int inf 0x3f3f3f3f int love maxn maxn 記錄每個妹子和每個男生的好感度 in...

KM演算法模板

km演算法是用來求完全二分圖最大完美匹配的演算法,其原理是不斷尋找增廣路 增廣路定理 相關性質 在最大二分圖匹配圖中,w x y lx x ly y include include include include include using namespace std const int maxn ...

KM演算法模板

int maxdata 1000000000 int w arraysize arraysize 權值 int match arraysize 儲存匹配資訊,其中i為y中的頂點標號,match i 為x中頂點標號 int lx arraysize ly arraysize slack arraysi...