【洛谷T4896】小Z爱划水

题目描述

小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水?

每个人都有自己的一个意见,有的人想做题,有的人想划水。

当然,每个人只能选择一个事情做。如果一个人做的事情和他想做的不同,那么他会产生1不满意度。

更棘手的是,他们之间一些人是朋友,如果两人是朋友,但是他们做的事情不同,那么会有1不满意度产生。

小Z不想看到大家闹得不高兴,他想知道,不满意度最小能是多少?

输入输出格式

输入格式:

第一行两个数字n,m 分别表示有n个人和m对朋友关系

第二行n个0/1,1表示想做题,0表示想划水。

然后是m行,每行两个数字a,b 表示a和b是朋友

输出格式:

输出只包含一个数字,表示最小的不满意度。

解析:

考虑最小割

如果一个选项是1,从S向它连流量1的边,

否则从它向T连流量1的边.

每对关系之间互相连流量1的边.

然后跑一遍最大流求它的最小割......

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define S 0
#define T 301
#define INF 2000000000
using namespace std;
inline int read(){
 int x = 0,f = 1; char ch = getchar();
 while(ch < ‘0‘||ch > ‘9‘) {if(ch == ‘-‘) f =-1; ch = getchar();}
 while(ch >=‘0‘&&ch <=‘9‘) {x = x*10+ch-‘0‘; ch = getchar();}
 return x * f;
}
int n,m,q[T+5],top=0,head[T+5],d[T+5],cnt=1,ans=0;
struct edge{int to,next,w;}e[T*T*10+5];
void ins(int f,int t,int w){
 e[++cnt]=(edge){t,head[f],w};head[f]=cnt;
 e[++cnt]=(edge){f,head[t],0};head[t]=cnt;
}
int dfs(int x,int f){
 if(x==T) return f;
 int used=0;
 for(int i=head[x];i;i=e[i].next)
  if(e[i].w&&d[e[i].to]==d[x]+1){
   int w=dfs(e[i].to,min(f-used,e[i].w));
   used+=w; e[i].w-=w; e[i^1].w+=w;
   if(used==f) return f;
  }
 return d[x]=-1,used;
}
bool bfs(){
 memset(d,0,sizeof(d)); int i,j;
 for(d[q[top=i=1]=S]=1;i<=top;++i)
  for(j=head[q[i]];j;j=e[j].next)
   if(e[j].w&&!d[e[j].to])
    d[q[++top]=e[j].to]=d[q[i]]+1;
 return d[T];
}
int main(){
 n=read(); m=read();
 for(int i=1;i<=n;i++) read()?ins(S,i,1):ins(i,T,1);
 int x,y;
 for(int i=1;i<=m;i++){
  x=read(); y=read();
  ins(x,y,1); ins(y,x,1);
 }
 while(bfs()) ans+=dfs(S,INF);
 printf("%d\n", ans);
 return 0;
}

时间: 2024-11-03 03:24:26

【洛谷T4896】小Z爱划水的相关文章

小Z爱划水

题目背景 小Z在机房. 题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他会产生1不满意度. 更棘手的是,他们之间一些人是朋友,如果两人是朋友,但是他们做的事情不同,那么会有1不满意度产生. 小Z不想看到大家闹得不高兴,他想知道,不满意度最小能是多少? 输入输出格式 输入格式: 第一行两个数字n,m 分别表示有n个人和m对朋友关系 第二行n个0/1

洛谷—— P2117 小Z的矩阵

https://www.luogu.org/problemnew/show/2117 题目描述 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1,则G(A)等于所有A[i][j]*A[j][i]的和对2取余之后的结果.举一个例子: 对于上图这个3*3矩阵A,G(A)=(1*1+1*0+1*1+0*1+1*1+1*0+1*1+ 0*1+0*0) mod 2=0 当然询问一个矩阵的G值实在是太简单了.小Z在给出一个N*N矩阵的同时将给你Q个操作

洛谷——P2117 小Z的矩阵

P2117 小Z的矩阵 题目描述 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1,则G(A)等于所有A[i][j]*A[j][i]的和对2取余之后的结果.举一个例子: 对于上图这个3*3矩阵A,G(A)=(1*1+1*0+1*1+0*1+1*1+1*0+1*1+ 0*1+0*0) mod 2=0 当然询问一个矩阵的G值实在是太简单了.小Z在给出一个N*N矩阵的同时将给你Q个操作,操作描述如下: 操作1:形如一个整数1和一个整数x,表示将第

洛谷P1120 小木棍

洛谷1120 小木棍 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.     现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.     给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度. 输入输出格式 输入格式: 输入文件共有二行. 第一行为一个单独的整数N表示砍过以后的小木棍的总数,其中N≤60 (管理员注:要把超过50的长度自觉过滤掉,坑了很多人了!) 第二行为N个用空个隔开的正整数,表示N根小木棍的长度.

【基础练习】【背包DP】洛谷1164 小A点菜题解

洛谷的题目又有那令人···的悲剧格式= = 洛谷1164 小A点菜 本题地址:http://www.luogu.org/problem/show?pid=1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:"随便点". 题目描述 不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000). 餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种

洛谷 3951 小凯的疑惑

洛谷 3951 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品. 输入输出格式 输入格式: 输入数据仅一行,包含两个正整数 aa 和 bb ,它们之间用一个空格隔开,表示小凯手 中金币的面值. 输出格式: 输出文件仅一行,一个正整数 NN ,表示不找零的情况下,小凯用手中

洛谷 P3951 小凯的疑惑

问题描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品. 输入格式 输入文件名为math.in. 输入数据仅一行,包含两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯手中金币的面值. 输出格式 输出文件名为math.out. 输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的

【0521模拟赛】小Z爱数学

题目描述 小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和. 小Z发现还是很水,所以他决定加大难度. 求 小Z还准备了很多个询问.现在你来解决一下吧. 输入输出格式 输入格式: 第一行两个整数m 表示询问的个数 接下来每行两个数ni,ki,表示这个询问的n和k 输出格式: , 也就是把刚好等于k的答案加进去  然后k变大 对于每个询问输出一行一个整数,表示对应的答案. 题目理解:F(n,k)表示n的所有因数qi中,满足n/qi<=k的和, m组,每组给定n

小Z爱序列(NOIP信(sang)心(bin)赛)From Fall_Dream(粗制单调队列&amp;单调栈的算法解析)

原题: 小Z最擅长解决序列问题啦,什么最长公共上升然后下降然后上升的子序列,小Z都是轻松解决的呢. 但是小Z不擅长出序列问题啊,所以它给了你一道签到题. 给定一个n个数的序列ai,你要求出满足下述条件的点对的数量. 假设点对是(i , j),max(l,r)是[l,r]当中最大的ai的值. 这个点对满足条件当且仅当i+1<j 且 ai < max(i+1,j-1) < aj 为了简单,保证输入的是一个1-n的排列.相信你已经会做了吧? 输入/输出格式 输入数据第一行有一个数字n,然后第二