J Spy(多重匹配KM演算法)

2021-10-14 12:58:20 字數 4490 閱讀 6357

隨機打,最後答案乘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中,至少有乙個為偶數...