Usaco 小行星群

2021-08-14 03:32:25 字數 1238 閱讀 8892

bessie想駕駛她的飛船穿過危險的小行星群,小行星群是乙個n×n的網格(1 <= n <= 500),在網格內有k個小行星(1 <= k <= 10,000)。

幸運地是bessie有乙個很強大的**,一次可以消除所有在一行或一列中的小行星,這種**很貴,所以她希望盡量地少用。給出所有的小行星的位置,算出bessie最少需要多少次射擊就能消除所有的小行星。

第1行:兩個整數n和k,用乙個空格隔開。

第2行至k+1行:每一行有兩個空格隔開的整數r和c(1 <= r, c <= n),分別表示小行星所在的行和列。

1行:乙個整數表示bessie需要的最少射擊次數,可以消除所有的小行星。

3 4

1 1

1 3

2 2

3 2網路流的演算法並不難,最關鍵的地方在於建模。

建乙個源點s和乙個匯點t。

s向每一行連一條長度為1的邊,每一列再向t連一條長度為1的邊。然後如果有小行星,就從行向列連一條邊,邊權為inf。

顯然乙個最小割就可以了。

因為割掉一條邊就相當於是讓一條inf的邊無效,就相當於除掉了乙個小行星。

#include 

#include

#include

#define fo(i,a,b) for (i=a;i<=b;i++)

using namespace std;

const int inf=10000007;

const int maxn=200050;

int n,i,k,s,t,ans,tot,x,y;

intq[maxn],head[maxn],next[maxn],b[maxn],c[maxn],cur[maxn],d[maxn];

void plus(int

x,int

y,int z)

void add(int

x,int

y,int z)

int bfs()}}

if (d[t]>0) return

1; else

return0;}

int dfs(int

x,int f)}}

return0;}

int main()

fo(i,1,k)

while (bfs())

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

}

(做網路流的題目有一點好處,就是只要會建模,直接co板子就好了)

bzoj1741 穿越小行星群

將每一行 每一列作為乙個點,對於乙個障礙 x,y 要麼第 x行和第 y列的狀態 是否攻擊 只需要有乙個就可以了,將第 x行和第 y列連邊,就是二分圖的最小點覆蓋 最大匹配數。1 include2 using namespace std 3 define n 1005 4struct jiedge n...

最大匹配 小行星

貝西想以n x n網格 1 n 500 的形狀在危險的小行星場中導航她的飛船。網格包含k個小行星 1 k 10,000 它們方便地位於網格的晶格點處。幸運的是,貝茜擁有強大的 可以一擊就蒸發掉網格中任何給定行或列中的所有小行星,這種 非常昂貴,因此她希望謹慎使用。欄位中,找到貝西需要射擊以消除所有小...

小行星 SSL 1341(最大匹配)

描述 貝西希望通過乙個n n網格 1 n 500 形狀的危險小行星場來駕駛她的飛船。網格包含k個小行星 1 k 10,000 位於網格的格點處。幸運的是,貝西有乙個強大的 可以在任何給定的行或列中的乙個單一的射擊汽化所有的小行星。這個 是相當昂貴的,所以她希望使用它節省。給所有的小行星的位置找到貝西...