[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1934

[算法]

首先 , 选择睡觉的人和不选择睡觉的人构成两个集合

这启发我们用最小割解决该问题 :

1. 将源点与每个睡觉的人连边 , 将每个不睡觉的人与汇点连边 , 割掉这样的一条边的含义是 : 有一个人放弃了睡觉 / 不睡觉 , 产生了1冲突

2. 将朋友之间连边 , 割掉这样一条边的含义是 : 这两个人产生了冲突

求解这个图的最小割即可

时间复杂度 : O(dinic(N , M))

[代码]

#include<bits/stdc++.h>
using namespace std;
#define N 310
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int inf = 1e9; struct edge
{
int to , w , nxt;
} e[N * N * ]; int tot , n , m , S , T;
int head[N] , dep[N]; template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void addedge(int u , int v , int w)
{
++tot;
e[tot] = (edge){v , w , head[u]};
head[u] = tot;
++tot;
e[tot] = (edge){u , , head[v]};
head[v] = tot;
}
inline bool bfs(int s)
{
queue< int > q;
memset(dep , , sizeof(dep));
q.push(s);
dep[s] = ;
while (!q.empty())
{
int cur = q.front();
q.pop();
for (int i = head[cur]; i; i = e[i].nxt)
{
int v = e[i].to , w = e[i].w;
if (w > && dep[v] == -)
{
dep[v] = dep[cur] + ;
q.push(v);
if (v == T) return true;
}
}
}
return false;
}
inline int dinic(int u , int flow)
{
int rest = flow;
if (u == T)
return flow;
for (int i = head[u]; i && rest; i = e[i].nxt)
{
int v = e[i].to , w = e[i].w;
if (w > && dep[v] == dep[u] + )
{
int k = dinic(v , min(rest , w));
if (!k) dep[v] = ;
rest -= k;
e[i].w -= k;
e[i ^ ].w += k;
}
}
return flow - rest;
} int main()
{ read(n); read(m);
tot = ;
S = n + , T = S + ;
for (int i = ; i <= n; i++)
{
int x;
read(x);
if (!x) addedge(S , i , );
else addedge(i , T , );
}
for (int i = ; i <= m; i++)
{
int x , y;
read(x); read(y);
addedge(x , y , );
addedge(y , x , );
}
int ans = ;
while (bfs(S))
{
while (int flow = dinic(S , inf)) ans += flow;
}
printf("%d\n" , ans); return ;
}

[SHOI 2007] 善意的投票的更多相关文章

  1. [SHTSC 2007] 善意的投票

    我就是来复习Dinic算法的,仅10天不写,我已经退化成写一遍+调试需要接近一个小时了,当然其中不乏在网上乱逛的时间… 赞成从S源点连一条单向边,反对向T汇点连一条单向边,朋友关系连双向边. 但是总感 ...

  2. 「SHOI2007」「Codevs2341」 善意的投票(最小割

    2341 善意的投票 2007年省队选拔赛上海市队选拔赛 时间限制: 5 s 空间限制: 128000 KB 题目等级 : 大师 Master   题目描述 Description 幼儿园里有n个小朋 ...

  3. C++之路进阶——bzoj1934(善意的投票)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...

  4. BZOJ-1934 Vote 善意的投票 最大流+建图

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1551 Solved: 951 [Submit][S ...

  5. bzoj1934: [Shoi2007]Vote 善意的投票

    最大流..建图方式都是玄学啊.. //Dinic是O(n2m)的. #include<cstdio> #include<cstring> #include<cctype& ...

  6. BZOJ 1934: [Shoi2007]Vote 善意的投票 最小割

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnl ...

  7. 1934: [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1174  Solved: 723[Submit][S ...

  8. 【BZOJ1934】善意的投票(网络流)

    [BZOJ1934]善意的投票(网络流) 题面 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己 ...

  9. BZOJ_1934_[Shoi2007]Vote 善意的投票

    BZOJ_1934_[Shoi2007]Vote 善意的投票 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然 ...

随机推荐

  1. Android Studio 设置项目Module编码,解决Android Studio项目执行时乱码问题

    Android Studio的项目设置逻辑与Eclipse有非常大的差别.运行的操作为File->Setting->File Encodings然后来进行设置,如图所看到的: waterm ...

  2. [Algorithm] Breadth First JavaScript Search Algorithm for Graphs

    Breadth first search is a graph search algorithm that starts at one node and visits neighboring node ...

  3. TI C66x DSP 四种内存保护问题 -之- 针对CPU訪问外存(DDR3 or MSM)时的内存保护问题 - 举例

    在代码维护中遇到过这种问题,CPU訪问了corePac的外部内存空间0x75510C55地址,即CPU向corePac的L2内存控制器发起了对该内存的訪问,然后L2内存控制器将该请求发给corePac ...

  4. UVA10317- Equating Equations(回溯+剪枝)

    题目链接 题意:给出一个式子,但这个式子不一定是等式,在'+','-','='符号位置不变的情况下,又一次排列数字的位置,使其成为等式.假设能够的话.输出当中一种排列方式. 思路:我们将等号右边的数所 ...

  5. C语言函数的递归和调用

    函数记住两点: (1)每个函数运行完才会返回调用它的函数:每个函数运行完才会返回调用它的函数,因此,你可以先看看这个函数不自我调用的条件,也就是fun()中if条件不成立的时候,对吧,不成立的时候就是 ...

  6. WPF 的 MVVM

    Model——View——ViewModel http://www.cnblogs.com/fdyang/p/3877309.html

  7. Unity光滑与粗糙的材质——相似于生锈的金属表面

    纹理是在Photoshop中制作的,终于效果则是在Unity里得到的.这样的类型的材质.在3D游戏中非经常见.

  8. C#.NET开源项目、机器学习、Power BI (转载)

    .NET技术, 开源项目, 数据挖掘, 机器学习, 微软Power BI, 足球赛事分析, Matlab与C#编程 博客园 管理 本站首页 头条推荐 Power BI .NET开源 机器学习 博客美化 ...

  9. html的dtd声明

    其实DOCTYPE声明,因为很多时候团队里没有做规范应该用哪个,而且几种不同的编辑工具新建出的html页面标准也不同:这就可能一个jsp页面写了几百行甚至上千行了,然后发现某个样式必须要改DOCTYP ...

  10. javascript 中 "undefined" 与 "is not defined" 分析

      var var1; console.log( typeof var0);//print "undefined",主要看下面对var0单独的输出 console.log( typ ...