集訓試題 exam 信心考 最小割

2022-05-10 04:13:56 字數 2458 閱讀 2616

題意概述:

有n個人,a,b兩個考場。如果學生i在a考場,總信心值增加xi;如果學生i在b考場,總信心值增加yi。其中還有m對好友,當第i對好友的兩個人都在a考場時,總信心值增加ai;如果兩人都在b考場,總信心值增加bi;如果兩個人在不同考場,那麼總信心值減少ci。

問總信心值最大能達到多少(總信心值的初始值為0)。

n<=10000,m<=50000,time limit = 1s

分析:這類最小割問題非常經典,一般都是有兩個集合,每個元素屬於某個集合可以得到某種收益,同時還會有一些兩個元素之間的關係,比如被分到同乙個集合或者不同集合需要付出的代價/得到的收益等等。思路是首先我們將所有的收益全部加起來,假設我們得到了所有的收益,然後建圖跑最小割求我們需要付出的最小代價,最大收益=所有可能的收益-最小代價。

說一下此題的建圖,此題本身選擇就可能產生代價,因此把代價看成收益。假設我們一開始從獲得的總收益為,所有的x,y,a,b,c的和。

令s代表b考場,t代表a考場,s向所有考生連邊容量為yi,當這條邊被割掉的時候考生i被選入a考場,付出代價yi;所有考生向t連一條邊容量為xi,意義同上;所有的朋友之間,s向兩個點分別連邊,容量為(b+c)/2,當這兩條邊被一起割掉的時候他們都在a考場,付出代價b+c;兩個點向t連邊,意義類似;兩個點之間連一條容量為(a+b+2c)/2,當兩個考生在不同考場的時候(在網路意義下他們不連通)這條邊被割掉,這對朋友一共付出代價a+b+2c。

跑最小割即可,因為建圖的時候涉及到除以二的問題所以先把所有的邊容量乘以2,最後把這個2除回來即可。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include

9 #include10 #include11 #include12

#define inf 9e18

13using

namespace

std;

14const

int maxn=10005;15

const

int maxm=50005

;16 typedef long

long

ll;17

18int

n,m,a[maxn],b[maxn],s,t,tot;

19struct datac[maxm];

20struct net_edgene[4*maxn+10*maxm];

21int

nfirst[maxn],nnp,cur[maxn],fl[maxn],d[maxn],gap[maxn];

22int

mq[maxn],front,rear;

2324

void _scanf(int &x)

2531

void

data_in()

3240}41

void net_add_edge(int u,int

v,ll cap)42;

44 nfirst[u]=nnp;

45 ne[++nnp]=(net_edge);

46 nfirst[v]=nnp;47}

48void _net_add_edge(int u,int

v,ll cap)49;

51 nfirst[u]=nnp;

52 ne[++nnp]=(net_edge);

53 nfirst[v]=nnp;54}

55void

build_net()

5662

intu,v;

63for(int i=1;i<=m;i++)71}

72void bfs(int

s)7385}

86}87 ll augment(int s,int

t)88

94 now=t;

95while(now!=s)

99return

flow;

100}

101 ll isap(int s,int

t)102

112bool ok=0

;113

for(int p=cur[now];p;p=ne[p].next)

121}

122if(!ok)

128if(--gap[d[now]]==0) break

;129 gap[d[now]=minl]++;

130 cur[now]=nfirst[now];

131if(now!=s) now=ne[fl[now]].from

;132

}133

}134

return

maxflow;

135}

136void

work()

137145

intmain()

146

view code

C 常考面試題

1.string類的實現 string string const char str else string string const string str string string operator const string str delete m data m data new char st...

Redis常考面試題

select命令切換資料庫 select 1 dbsize檢視當前資料庫的key的數量 dbsize flushdb清空當前庫,flushall清空全部庫 1.對鍵的操作 檢視所有的key keys 判斷某個key是否存在 exists key的名字 檢視key的型別 type key 從某個庫中刪...

面試常考 HTML5常考面試題

1.doctype的作用是什麼?doctype宣告用於告訴瀏覽器使用哪種模式來進行html文件解析。doctype宣告有兩種 標準模式和怪異模式 混雜模式 doctype不存在或形式不正確會導致html文件以混雜模式呈現。標準模式與混雜模式的區別請參考第3道面試題。2.img標籤的alt屬性和tit...