POJ3041 Asteroids(匈牙利演算法)

2022-05-09 12:18:12 字數 1210 閱讀 6897

嘟嘟嘟

雖然我已經會網路流了,但是還是學了乙個匈牙利演算法。

——就跟我會線段樹,但還是學了樹狀陣列一樣。

其實匈牙利演算法挺暴力的。簡單來說就是先貪心匹配,然後如果左部點\(i\)匹配不上了,就嘗試更改前面已經匹配好的點,騰出地給他匹配。

因此對於每乙個點跑一遍匈牙利演算法,如果這個點匹配成功,總匹配數就加1。

感覺沒啥好講的。

關於這道題怎麼做,看我這篇部落格吧。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define enter puts("")

#define space putchar(' ')

#define mem(a, x) memset(a, x, sizeof(a))

#define rg register

typedef long long ll;

typedef double db;

const int inf = 0x3f3f3f3f;

const db eps = 1e-8;

const int maxn = 505;

const int maxe = 1e4 + 5;

inline ll read()

inline void write(ll x)

int n, k;

struct edge

e[maxe];

int head[maxn], ecnt = -1;

void addedge(int x, int y)

; head[x] = ecnt;

}int fa[maxn], vis[maxn], vcnt = 0;

//fa:下標是右部點,表示右部點i和左部點fa[i]匹配上了

//vis:表示匹配點i的時候這個點是不是i要匹配的

//因此每一次dfs前應該清空,為了降低複雜度,改為累加標記

bool dfs(int now) }

}return 0;

}int main()

int ans = 0;

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

write(ans), enter;

return 0;

}

POJ 3041 Asteroids 最小覆蓋數

題目大意 一輛宇宙飛船在乙個小行星帶中,你知道,這很危險。他有一種 可以清除掉一行或一列的小行星。問把小行星全部清除最少的 使用次數。思路 因為每次可以清除掉一行或者一列,所以可以把行和列建成圖,行和列為邊,因為最後要全部清除,也就是說所有邊都使用過,正好就是最小覆蓋數。最小覆蓋數 最大匹配。inc...

POJ3041 最小頂點覆蓋

題意 給你乙個n n 的矩陣,和x所在的座標,問你最少放多少個 可以把圖里的所有x都覆蓋,每個 可以覆蓋一行,或者一列。思路 最小頂點覆蓋,最小頂點覆蓋 二分匹配,每一行最多放乙個,每一列最多放乙個,對於每乙個點,他只要被一行或者一列照應就行了。所以直接把x所在的點的行和列連線在一起,二分後對於當前...

poj 3041 Asteroids 最大匹配

把每一列當成乙個點,每一行當成乙個點,若行節點和列節點之間有邊,則表明該行列該列有乙個障礙物。可以放炸彈炸掉成行或者成列的障礙物!主要是構圖 將每一行當成乙個點,構成集合1,每一列也當成乙個點,構成集合2 每乙個障礙物的位置座標將集合1與集合2中的點連線起來,也就是將每乙個障礙物作為連線節點的邊。這...