JZOJ 5934. 列队
Posted traveller-ly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZOJ 5934. 列队相关的知识,希望对你有一定的参考价值。
做法:行列棋盘图为二分图经典模型,令行为左侧点,列为右 侧点,有同学的格子就在对应行列之间连一条边,那么问题:一共最 多取出多少行和列 就转化为 二分图上最大的最大独立集问题 最大独立集点数=总点数-最大匹配数 匈牙利算法即可
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 8007 5 using namespace std; 6 struct edge{ 7 int to,next; 8 }e[N]; 9 int n,m,tot,ls[N]; 10 int g[N],cnt,used[N]; 11 12 void add(int x,int y){ 13 e[++tot].to=y; 14 e[tot].next=ls[x]; 15 ls[x]=tot; 16 } 17 18 void Init(){ 19 scanf("%d%d",&n,&m); 20 for(int i=1;i<=m;i++){ 21 int x,y; 22 scanf("%d%d",&x,&y); 23 add(x,y+n); 24 add(y+n,x); 25 } 26 } 27 28 bool find(int x){ 29 for(int i=ls[x];i;i=e[i].next){ 30 int v=e[i].to; 31 if (used[v]) continue; 32 used[v]=1; 33 if (g[v]==0||find(g[v])){ 34 g[v]=x; 35 return 1; 36 } 37 } 38 return 0; 39 } 40 41 void Work(){ 42 for(int i=1;i<=n;i++){ 43 memset(used,0,sizeof(used)); 44 if (find(i)) cnt++; 45 } 46 } 47 48 int main(){ 49 freopen("phalanx.in","r",stdin); 50 freopen("phalanx.out","w",stdout); 51 Init(); 52 Work(); 53 printf("%d",cnt*n+(n-cnt)*2*n); 54 }
以上是关于JZOJ 5934. 列队的主要内容,如果未能解决你的问题,请参考以下文章