清明節也不能懈怠
雖然已經打了好久了隔膜了
但是你說不做題目也是不行的啊
今天學了乙個公式: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.每支軍隊可以從任意乙個城鎮出發,並只能從...