19_04_02校内训练[deadline]

题意

给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定。染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的。求出这两个新的二分图的最大匹配数的和的最小值。数均小于等于5000。


 

思考

这是简化题意。由于暴力很难写,考虑网络流。将B集合中的每一个点根据其颜色分为一类和二类点。对于A集合中的每一个点,拆成两个点,两点连1的单向边,将所有相邻的一类点连线左边,另一类连向右边,值为1。所有二类点连向汇点,源点连向所有一类点。最小割。

这样,若割掉了某条边,代表了将某个点相邻的所有A集合中的点都染成了相同的颜色,并断绝了其他点的后路。


 

代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1E5+5;
 4 const int inf=INT_MAX;
 5 int head[maxn*2],size=1,n,m,a[maxn],dfn[maxn],S,T,x,y,ans,k;
 6 struct edge{int to,next,w;}E[maxn*2];
 7 void add(int u,int v,int w)
 8 {
 9     E[++size].to=v;
10     E[size].next=head[u];
11     E[size].w=w;
12     head[u]=size;
13     
14     E[++size].to=u;
15     E[size].next=head[v];
16     E[size].w=0;
17     head[v]=size;
18 }
19 bool bfs()
20 {
21     queue<int>Q;
22     for(int i=0;i<=T;++i)dfn[i]=-1;
23     dfn[S]=0;
24     Q.push(S);
25     while(Q.size())
26     {
27         int u=Q.front();
28         Q.pop();
29         for(int i=head[u];i;i=E[i].next)
30         {
31             int v=E[i].to;
32             if(E[i].w==0||dfn[v]!=-1)continue;
33             dfn[v]=dfn[u]+1;
34             Q.push(v);
35         }
36     }
37     return dfn[T]!=-1;
38 }
39 int dinic(int u,int up)
40 {
41     if(u==T)return up;
42     int sum=0;
43     for(int i=head[u];i;i=E[i].next)
44     {
45         int v=E[i].to;
46         if(E[i].w==0||dfn[v]!=dfn[u]+1)continue;
47         int g=dinic(v,min(E[i].w,up-sum));
48         E[i].w-=g;
49         E[i^1].w+=g;
50         sum+=g;
51         if(g==0)dfn[v]=-1;
52         if(sum==up)break;
53     }
54     return sum;
55 }
56 int main()
57 {
58 //    freopen("deadline.in","r",stdin);
59 //    freopen("deadline.out","w",stdout);
60     ios::sync_with_stdio(false);
61     cin>>n>>m>>k;
62     for(int i=1;i<=n;++i)cin>>a[i];
63     for(int i=1;i<=k;++i)
64     {
65         cin>>x>>y;
66         if(a[x])add(x,y+n,inf);
67         else add(y+n+m,x,inf);
68     }
69     S=0;
70     T=n+m*2+1;
71     for(int i=1;i<=m;++i)add(i+n,i+n+m,1);
72     for(int i=1;i<=n;++i)
73         if(a[i])add(S,i,1);
74         else add(i,T,1);
75     while(bfs())ans+=dinic(S,inf);
76     cout<<ans<<endl;
77     return 0;
78 }
View Code

 

转载于:https://www.cnblogs.com/GreenDuck/p/10643886.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值