博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ-3894 文理分科 最小割
阅读量:6546 次
发布时间:2019-06-24

本文共 2315 字,大约阅读时间需要 7 分钟。

题意:给定一个n×m的矩阵,每个格子的人可以学文或者学理,学文和学理各有一个满意度,如果以某人为中心的十字内所有人都学文或者学理还会得到一个额外满意度,求最大满意度之和

   给你一个n×m的图,你可以给每个点染1或者0,对于每个点染1或者0都有一个权值的收益,如果一个点周围有公共边的点都选择了1或者0,也会有一个权值的收益,一个给你4个收益矩阵,求最大的收益

 

题解:

  令S为学文,T为学理

  每个人学文就S连向人,学理就人连向T

  如果某个集合内的人都学理会获得一个满意度,那么就新加一个点,将集合内的所有人向这个点连流量为inf的边,再从这个点向T连一条流量为满意度的边,表示集合内任意一个人学文都要把这个点与T的边割掉

  学文同理

  再求最小割就行了


 

        其实,学过的话就很容易想到,这个问题不过是把多元关系转换成二元关系就好

   我们对每个节点x新建两个点x0,x1分别表示x周围是否都是0和是否都是1,就有了四种二元关系

   x是0 且 x周围都是0,那么就有v1的收入

   x是1 且 x周围都是1,那么就有v2的收入

   x周围都是0,与x相邻的点必须为0,如果为1,则造成inf的代价

   x周围都是1,与x相邻的点必须为1,如果为0,则造成inf的代价

   然后二元组建图即可

1 #include
2 using namespace std; 3 #define N 30005 4 #define M 300005 5 #define inf 0x7fffffff/3 6 namespace Dinic 7 { 8 int head[N],head2[N],p=1; 9 struct rec 10 { 11 int go,nex,c; 12 }eg[M*2]; 13 void build(int a,int b,int c) 14 { 15 eg[++p]=(rec){b,head[a],-c}; 16 head[a]=p; 17 eg[++p]=(rec){a,head[b],0}; 18 head[b]=p; 19 } 20 int dis[N],q[N],s[N],S,T,stop,ans; 21 bool bfs() 22 { 23 memset(dis,0,sizeof(dis)); 24 dis[T]=1; 25 q[1]=T; 26 for (int p1=1,p2=1;p1<=p2;p1++) 27 { 28 for (int i=head[q[p1]];i;i=eg[i].nex) 29 if (eg[i^1].c<0 && !dis[eg[i].go]) 30 { 31 dis[eg[i].go]=dis[q[p1]]+1; 32 q[++p2]=eg[i].go; 33 } 34 } 35 if (!dis[S]) return 0; 36 memcpy(head2,head,sizeof(head)); 37 return 1; 38 } 39 bool dinic(int p,int top) 40 { 41 if (p==T) 42 { 43 int x=inf; 44 for (int i=1;i<=top-1;i++) if (-eg[s[i]].c
n || y>m) continue;109 build(id[i][j]+m*n,id[x][y],inf);110 }111 }112 for (int i=1;i<=n;i++)113 for (int j=1;j<=m;j++)114 {115 scanf("%d",&a);116 anss+=a;117 build(id[i][j]+2*m*n,tt,a);118 for (int k=0;k<5;k++)119 {120 x=i+dx[k];121 y=j+dy[k];122 if (x<=0 || y<=0 || x>n || y>m) continue;123 build(id[x][y],id[i][j]+2*m*n,inf);124 }125 }126 init(ss,tt);127 printf("%d\n",anss-ask()); 128 }

 

转载于:https://www.cnblogs.com/qywhy/p/9707553.html

你可能感兴趣的文章
C# CancellationTokenSource和CancellationToken的实现
查看>>
PCIE BAR空间
查看>>
如何用数学课件制作工具画角平分线
查看>>
VS2015 中统计整个项目的代码行数
查看>>
UWP控件与DataBind
查看>>
bash: php: command not found
查看>>
XVIII Open Cup named after E.V. Pankratiev. Eastern Grand Prix
查看>>
《高性能mysql》到手
查看>>
(转)关于如何学好游戏3D引擎编程的一些经验
查看>>
使用Kotlin为你的APP自定义一个统一的标题栏
查看>>
EF各版本增删查改及执行Sql语句
查看>>
拓扑排序
查看>>
jQGrid API
查看>>
Bzoj1758: [Wc2010]重建计划
查看>>
redis集群部署及踩过的坑
查看>>
j2EE监听器-listener
查看>>
使用pip命令报You are using pip version 9.0.3, however version 18.0 is available pip版本过期.解决方案...
查看>>
(转)LINQ之路
查看>>
volatile和synchronized的区别
查看>>
10.30T2 二分+前缀和(后缀和)
查看>>