hdu1565 網路流或狀態壓縮DP

2022-05-22 07:42:11 字數 1351 閱讀 6240

對於網路流有乙個定理:

最小點權覆蓋集=最大網路流;

最大點權獨立集=總權值-最小點權覆蓋集;

網路流解法**如下:

#include#include

#include

#include

#define n 1010

#define m 50010

#define inf 1<<30

using

namespace

std;

struct

edgeedge[m];

intindex[n],d[n],gap[n],e;

void addedge(int

from,int to,int

val)

intsource,des,n,m;

//n is the number of point

int dfs(int pos,int

flow)

if(d[v]//

找出與pos相連的點的最小標號

} }

if(lv==flow)//

沒有找到增廣路勁,進行標號更新

return flow-lv;

}int sap(int st,int

de)

return

ans;

}void

init()

int pos(int a,int

b)int

main()

else

addedge(pos(i,j),m*m+1

,w);

}n=m*m+2

; printf(

"%d\n

",sum-sap(0,n-1

)); }

return0;

}

狀態壓縮解法:

#include#include

#include

#include

#include

using

namespace

std;

int s[1

<<21

];int map[22][22

];int dp[2][1

<<21

];int

main()}}

int ans=0

;

for(i=0;i1

尋找答案

ans=max(ans,dp[p][s[i]]);

printf(

"%d\n

",ans);

}return0;

}

hdu 1565 狀態壓縮DP

這題可以用最大流做,為了練dp就用狀態壓縮了。我一開始只想到乙個o n 2 n 2 n 的方法,效率太低,看了某大牛的解題報告後,才將演算法優化到o n 2 2 n 不過就這樣還wa了好幾次,原因是 中一句 if k t 0 我開始寫成了if k t 0 沒有注意到位運算子的優先順序是低於邏輯運算子...

HDU 1565 方格取數 1 狀態壓縮)

沒什麼好說的,主要看 注釋,取數,某個位置能放東西,某個位置不能放等等,這類寫法基本都是這樣 problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最...

hdu 1565 方格取數 1 狀態壓縮 dp

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...