隨機打,最後答案乘n,因為我方等概率的遇見敵人,相當於與n個敵人都打一遍,然後貢獻累加作為匹配邊權
bfs版本的km
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n=
510;
ll w[n]
[n],lx[n]
,ly[n]
;//頂標
bool visx[n]
,visy[n]
;//記錄是否在交錯樹上
int match[n]
;//匹配
int n,p[n]
;ll delta,c[n]
;//delta和更新後的delta
void
bfs(
int x)
for(
int b=
0;b<=n;b++)if
(visy[b]
) lx[match[b]]-
=delta,ly[b]
+=delta;
else
c[b]
-=delta;
y=y1;
}while
(match[y]);
while
(y) match[y]
=match[p[y]
],y=p[y];}
ll km()
ll res=0;
for(
int i=
1;i<=n;i++
) res+
=w[match[i]
][i]
;return res;
}ll a[n]
,p[n]
,b[n]
,c[n]
;int
main()
printf
("%lld\n",km
());
return0;
}
費用流
時間複雜度θ(n
mf
)\theta(nmf)
θ(nmf)
此題滿流,邊級別是n
2n^2
n2,於是費用流時間複雜度θ(n
4)
\theta(n^4)
θ(n4
)卡費用流就離譜,不得不多看乙個km演算法www
#define io ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma gcc optimize(2)
#include
#include
#include
#include
using namespace std;
const
int n=
810,m=
330010
,inf=
0x3f3f3f3f
;int n,s,t;
int h[n]
,e[m]
,ne[m]
,w[m]
,f[m]
,idx;
int d[n]
,flow[n]
,pre[n]
;bool st[n]
;queue<
int> q;
void
add(
int a,
int b,
int c,
int d)
bool spfa()
}}}return flow[t];}
intek()
}return cost;
}ll a[n]
,p[n]
,b[n]
,c[n]
;int
main()
cout<)<<
'\n'
;return0;
}
p6577 【模板】二分圖最大權完美匹配
km演算法——二分圖最大帶權匹配
【演算法筆記】二分圖最大權匹配 - km演算法(dfs版o(n4) + bfs版o(n3))
dfs時間複雜度o(n
4)
o(n^4)
o(n4
)
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n=
510;
ll w[n]
[n],lx[n]
,ly[n]
;//頂標
bool visx[n]
,visy[n]
;//記錄是否在交錯樹上
int match[n]
;//匹配
int n,m;
ll delta;
//delta和更新後的delta
bool
dfs(
int x)
else delta=
min(delta,lx[x]
+ly[y]
-w[x]
[y])
;// visx[x]=1,visy[y]=0更新delta
}return0;
}ll km()
} ll res=0;
for(
int i=
1;i<=n;i++
) res+
=w[match[i]
][i]
;return res;
}int
main()
printf
("%lld\n",km
());
for(
int i=
1;i<=n;i++
)printf
("%d "
,match[i]);
puts(""
);return0;
}
km演算法詳解和其更快優化方法(吊打傳統的slack優化)
bfs 時間複雜度o(n
3)
o(n^3)
o(n3)
把dfs換成 bfs。本質上沒有什麼區別
但是每個左邊的點只會進隊、搜尋一次。
用p陣列記錄的是增廣交錯樹。
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n=
510;
ll w[n]
[n],lx[n]
,ly[n]
;//頂標
bool visx[n]
,visy[n]
;//記錄是否在交錯樹上
int match[n]
;//匹配
int n,m,p[n]
;ll delta,c[n]
;//delta和更新後的delta
void
bfs(
int x)
for(
int b=
0;b<=n;b++)if
(visy[b]
) lx[match[b]]-
=delta,ly[b]
+=delta;
else
c[b]
-=delta;
y=y1;
}while
(match[y]);
while
(y) match[y]
=match[p[y]
],y=p[y];}
ll km()
ll res=0;
for(
int i=
1;i<=n;i++
) res+
=w[match[i]
][i]
;return res;
}int
main()
printf
("%lld\n",km
());
for(
int i=
1;i<=n;i++
)printf
("%d "
,match[i]);
puts(""
);return0;
}
要加油哦~
板子還是記住吧,具體啥的也沒啥
km演算法與最佳匹配
km演算法 該演算法是通過給每個頂點乙個標號 叫做頂標 來把求最大權匹配的問題轉化為求完備匹配的問題的。設頂點xi的頂標為a i 頂點yj的頂標為b j 頂點xi與yj之間的邊權為w i,j 在演算法執行過程中的任一時刻,對於任一條邊 i,j a i b j w i,j 始終成立。km演算法的正確性...
完美匹配 KM演算法 HDU總結
size medium kidx 的解題報告 img b size medium 首先獻上模板 size b define m 505 define inf 0x3fffffff bool sx m sy m int match m w m m n,m,d,lx m ly m n 左集元素個數 m ...
km演算法的非最優匹配應用
km演算法可以用來求最優匹配,但是,它本身蘊含著複雜的數學原理,我暫時還不知道怎麼理解,僅僅在此提一道非匹配應用。題目 爭奪 題目描述 小y和小p無聊的時候就喜歡玩遊戲,但是每次小p都輸給了小y。終於有一天,你看不過去了,決定幫小p一把。遊戲是這樣的,乙個n m的棋盤 保證n或m中,至少有乙個為偶數...