題目大意:
幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人數。 我們的問題就是,每位小朋友應該怎樣投票,才能使衝突數最小?
思路:
最小割,所有贊成的與源點連邊,所有反對的與匯點連邊,朋友之間連邊,求最小割即可。
1 #include2#define ios ios::sync_with_stdio(false);//
不可再使用scanf printf
3#define max(a, b) ((a) > (b) ? (a) : (b))//
禁用於函式,會超時
4#define min(a, b) ((a) < (b) ? (a) : (b))
5#define mem(a) memset(a, 0, sizeof(a))
6#define dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
7#define mid(l, r) ((l) + ((r) - (l)) / 2)
8#define lson ((o)<<1)
9#define rson ((o)<<1|1)
10#define accepted 0
11#pragma comment(linker, "/stack:102400000,102400000")//
棧外掛程式12
using
namespace
std;
13 inline int
read()
1417
while (ch>='
0'&&ch<='9')
18return x*f;19}
20 typedef long
long
ll;21
const
int maxn = 2000 + 10;22
const
int mod = 1000000007;//
const引用更快,巨集定義也更快
23const
int inf = 1e9 + 7;24
const
double eps = 1e-6;25
26struct
edge
2730
};31 vectore;
32 vectorg[maxn];
33int level[maxn];//
bfs分層,表示每個點的層數
34int iter[maxn];//
當前弧優化
35int
m;36
void addedge(int u, int v, int
c)37
44void bfs(int s)//
預處理出level陣列
45//
直接bfs到每個點
4663}64
}65}66
int dfs(int u, int t, int f)//
dfs尋找增廣路
6786}87
}88return0;
89}90int maxflow(int s, int
t)91
103}
104return
flow;
105}
106int
x[maxn];
107int
main()
108118
while(m--)
119127 printf("
%d\n
", maxflow(s, t));
128return
accepted;
129 }
BZOJ 1934 善意的投票 最小割
time limit 1 sec memory limit 64 mb submit 2354 solved 1471 submit status discuss 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,...
BZOJ1934Vote 善意的投票
1934 shoi2007 vote 善意的投票 time limit 1 sec memory limit 64 mb submit 1574 solved 960 description 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神...
SHOI2007 bzoj1934 善意的投票
description 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意...