JZOJ 5934. 列队

Posted traveller-ly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JZOJ 5934. 列队相关的知识,希望对你有一定的参考价值。

Description

        Sylvia是一个热爱学习的女孩子。
        在平时的练习中,他总是能考到std以上的成绩,前段时间,他参加了一场练习赛,众所周知,机房是一个 的方阵。这天,他又打爆了std,感到十分无聊,便想要hack机房内同学的程序,他会挑选一整行或一整列的同学进行hack ( 而且每行每列只会hack一次 ),然而有些同学不是那么好惹,如果你hack了他两次,他会私下寻求解决,Sylvia十分害怕,只会hack他们一次。假设Sylvia的水平十分高超,每次hack都能成功,求他最 多能hack多少次?
 

Input

   第一行两个数 表示机房的大小和不好惹的同学个数
  接下来x行,每行两个数 表示不好惹的同学坐标

Output

一个数表示最多hack多少次
 

Sample Input

2 1
1 1

Sample Output

6

样例说明
     他可以hack第一行、第二行、第二列一共6次
做法:行列棋盘图为二分图经典模型,令行为左侧点,列为右 侧点,有同学的格子就在对应行列之间连一条边,那么问题:一共最 多取出多少行和列 就转化为 二分图上最大的最大独立集问题 最大独立集点数=总点数-最大匹配数 匈牙利算法即可
技术分享图片
 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 }
View Code

 



以上是关于JZOJ 5934. 列队的主要内容,如果未能解决你的问题,请参考以下文章

ASEMI代理AD5934YRSZ-REEL7原装ADI车规级AD5934YRSZ-REEL7

HDU-5934-scc

HDU 5934 强联通分量

[HDOJ5934]Bomb(强连通分量,缩点)

Bomb---hdu5934(连通图 缩点)

「国庆训练」Bomb(HDU-5934)