對於網路流有乙個定理:
最小點權覆蓋集=最大網路流;
最大點權獨立集=總權值-最小點權覆蓋集;
網路流解法**如下:
#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...