題意概述:
有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 #includeview code9 #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
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...