HDU5772 最小割)

2022-08-05 16:09:15 字數 1542 閱讀 6969

problemstring problem (hdu5772)

題目大意

給定一個由數字組成的字串(n<=100),挑選出一些字元組成一個新的字串。

字串的價值: sigma w[id(i)][id(j))] (i !=j) id(i)為某字元在原串中的位置,w為給定矩陣。

字串的代價: 設x為數字i出現的次數,則代價為a[i]*(x-1)+b[i] (x>0)  0 (x=0) 

要求最大化價值-代價。

題目分析

比較難想到的最大權閉合圖模型。

昨天剛補完一道,今天又沒想出來~~ 

搬運官方題解:

參考程式

1 #include 2 #include 3 #include 4 #include 5

using

namespace

std;67

#define inf 2000000000

8#define v 6000

9#define e 100000

10int

n,m,ans,dis[v],s,t;

1112

struct

lineeg[e];

15int lt[v],sum=1;16

17void adt(int u,int v,int

c)20

21void add(int u,int v,int

c)25

26void

init()

3031

bool

bfs()45}

46}47return dis[t]>0;48

}4950int dfs(int u,int

flow)62}

63if (!res) dis[u]=-1;64

return

res;65}

6667

intdinic()

7273

intmain()

92 s=0,t=n*(n-1)/2+n+10+1,cnt=0;93

for (int i=1;i<=n;i++)

94for (int j=i+1;j<=n;j++)

100for (int i=1;i<=n;i++)

104for (int i=0;i<=9;i++)

105 add(n*(n-1)/2+n+i+1,t,(b[i]-a[i]));

106 n=t;

107 printf("

case #%d: %d\n

",++cas,ans-dinic());

108}

109 }

view code

HDU5772 String problem

vjudge 給你一個0 9組成的字串,你可以從中選取一個子序列 或者說一個集合 。 如果位置 i j 同時被選,就可以獲得 w i j 的收益。 對於每一種數字,設其被選的次數為 k i ,那麼你需要對這個數字付出的代價為 a i k i 1 b i k i 0 0 k i 0 求最大收益。 考...

hdu 1565 最小割

黑白染色,源指向白,黑指向匯,容量都是方格中數的大小,相鄰的格子白指向黑,容量為oo,然後求一次最小割。 這個割是一個簡單割,如果只選擇不在割中的點,那麼一種割就和一個選數方案一一對應,割的大小就是不選的那些數的大小,我們需要最小化這個值。 答案 總和 最小割 1 include 2 include...

HDU 4289 Control(最小割)

題意 有n個城市,m條無向邊,小偷要從s點開始逃到d點,在每個城市安放監控的花費是sa i ,問最小花費可以監控到所有小偷。 思路 求最小割...