BZOJ P2150 部落戰爭

2021-07-30 00:04:08 字數 1100 閱讀 4161

清明節也不能懈怠

雖然已經打了好久了隔膜了

但是你說不做題目也是不行的啊

今天學了乙個公式:dag的最小路徑覆蓋數=dag圖中的節點數-相應二分圖中的最大匹配數.

感覺網上的證明也不太好,yy了一下自己的證明

我的證明是這樣的:

先說怎麼做

直接每個dag上的點拆點然後建二分圖,原點和s連,然後拆出的點和t連跑最大匹配

然後我們可以發現,dag上的某一條路可以對應乙個所建的二分圖中的乙個匹配

同時可以得出乙個公式  dag路徑覆蓋可以=對應二分圖中的某乙個匹配

然後我要證   dag路徑覆蓋數=dag圖中的節點數-對應二分圖中的某乙個匹配

是這樣的,我假設一條路徑是a->b,b->c,c->d對應的二分圖上是a->b拆出來的點,b->c拆出來的點,c->d拆出來的點

然後相當於原圖上每一條路徑假設包含n個點,那麼就是在圖上的n-1個匹配

所以每一條路徑的產生,二分圖匹配就會拆乙個點,所以dag路徑覆蓋可以=對應二分圖中的某乙個匹配

然後我們要求的是dag的最小路徑覆蓋數

只要二分圖中的匹配數最大即可

證明完畢,不知道有沒有什麼疏漏有的請幫忙講出

然後知道了以上幾點,很容易做這題了,就是構圖跑最大匹配然後減一減就可以辣

下面是**:

#include#include#include#include#include#include#define maxn 2503

using namespace std;

int a[2503][2503],lk[2503],f[2503][2503],num[2503][2503];

int vis[2503];

int dx[5],dy[5];

char s[503];

int n,m,r,c,sum,ans,id;

int tim;

bool find(int x)

}} return 0;

}int main()

if(f[x][y])}}

}

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

}cout<<(id-ans)<

2150 部落戰爭

題目鏈結 題目大意 給出一張地圖,乙個軍隊要征戰整個土地。一塊土地只能經過一次,有x的地方不能走,軍隊只會走r c個格仔,只會向下走,問最少需要多少軍隊能夠征戰所有的土地 題解 比較 的dag最小路徑覆蓋,把可行點連邊,搞成二分圖就好了 我的收穫 水啊 include include include...

bzoj2150 部落戰爭

lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。a國是乙個m n的矩陣,其中某些地方是城鎮,某些地方是高山深澗無人居住。lanzerb把自己的部落分成若干支軍隊,他們約定 1.每支軍隊可以從任意乙個城鎮出發,並只能從上往向下征戰,不能回頭。途中只能...

BZOJ2150 部落戰爭

bzoj2150 部落戰爭 lanzerb的部落在a國的上部,他們不滿天寒地凍的環境,於是準備向a國的下部征戰來獲得更大的領土。a國是一 個m n的矩陣,其中某些地方是城鎮,某些地方是高山深澗無人居住。lanzerb把自己的部落分成若干支軍隊,他們 約定 1.每支軍隊可以從任意乙個城鎮出發,並只能從...