FZU 2039 pets

点击打开链接FZU2039

思路:二分图水题
分析:只要建模然后套模板ok

代码:

/*DFS求二分图的最大匹配*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXN 110
int T;
int Nx , Ny , e;/*Nx Ny分别表示的是左右两边的最大的集合的个数*/
int G[MAXN][MAXN];
int Mx[MAXN] , My[MAXN];/*Mx , My分别表示的是左右两边是否和另一边相连的点的编号*/
bool mark[MAXN];/*标记右边的点是否被匹配过*/

/*查找增广路*/
bool FindPath(int u){
    /*枚举所有的右边集合的点*/
    for(int i = 1 ; i <= Ny ; i++){
       if(G[u][i] && !mark[i]){
         mark[i] = true;
         if(My[i] == -1 || FindPath(My[i])){
           /*互换*/
           My[i] = u;
           Mx[u] = i;
           return true;
         }
       }
    }
    return false;
}

/*求最大的匹配*/
int MaxMatch(){
   int cnt = 0;
   memset(Mx , -1 , sizeof(Mx));/*左边集合初始话为空*/
   memset(My , -1 , sizeof(My));/*右边集合初始化为空*/
   /*每一次都找左边一个未匹配的点进行找增广路*/
   for(int i = 1 ; i <= Nx ; i++){
      if(Mx[i] == -1){
        memset(mark , 0 , sizeof(mark));/*每次的进行初始化mark数组*/
        if(FindPath(i))/*找到了增广路则cnt++*/
          cnt++;
      }
   }
   return cnt;
}

int main(){
   int a , b;
   scanf("%d" , &T);
   for(int i = 1 ; i <= T ; i++){
      scanf("%d%d%d" , &Nx , &Ny , &e);

      /*建模*/
      for(int j = 1 ; j <= Nx ; j++){
         for(int k = 1 ; k <= Ny ; k++)
            G[j][k] = 1;
      }
      for(int j = 0 ; j < e ; j++){
         scanf("%d%d" , &a , &b);
         G[a][b] = 0;
      }

      printf("Case %d: %d\n" , i , MaxMatch());
   }
   return 0;
}
/*BFS找二分图最大匹配*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXN 1010

int T;
int Nx , Ny;/*左边集合和右边集合*/
int G[MAXN][MAXN];/*存储关系的矩阵*/
int Mx[MAXN] , My[MAXN];/*左边和右边点和另外边相连的编号*/
int pre[MAXN] , Q[MAXN];
int mark[MAXN];

int MaxMatch(){
    int ans = 0;
    int front , rear;
    /*把左边和右边集合置为空*/
    memset(Mx , -1 , sizeof(Mx));
    memset(My , -1 , sizeof(My));
    memset(mark , -1 , sizeof(mark));

    for(int i = 1 ; i <= Nx ; i++){
       if(Mx[i] == -1){
          front = rear = 0;
          Q[rear++] = i;
          pre[i] = -1;

          bool flag = 0;

          while(front < rear && !flag){
              int u = Q[front];
              for(int v = 1 ; v <= Ny && !flag ; v++){
                 if(G[u][v] && mark[v] != i){
                   mark[v] = i;
                   Q[rear++] = My[v];
                   if(My[v] >= 0)
                     pre[My[v]] = u;
                   else{
                     flag = 1;
                     int d = u , e = v;
                     while(d != -1){
                         int t = Mx[d];
                         Mx[d] = e;
                         My[e] = d;
                         d = pre[d];
                         e = t;
                     }
                   }
                 }
              }
              front++;
          }
          if(Mx[i] != -1)
            ans++;
       }
    }
    return ans;
}

int main(){
   int a , b , e;
   scanf("%d" , &T);
   for(int i = 1 ; i <= T ; i++){
      scanf("%d%d%d" , &Nx , &Ny , &e);
      /*建模*/
      for(int j = 1 ; j <= Nx ; j++){
         for(int k = 1 ; k <= Ny ; k++)
            G[j][k] = 1;
      }
      for(int j = 0 ; j < e ; j++){
         scanf("%d%d" , &a , &b);
         G[a][b] = 0;
      }
      printf("Case %d: %d\n" , i , MaxMatch());
   }
   return 0;
}
时间: 2024-11-03 21:57:39

FZU 2039 pets的相关文章

杭电 acm 2039 ( 三角形 )判断这样用问什么会通不过呢?哪位大神讲讲正确的用法

问题描述 杭电 acm 2039 ( 三角形 )判断这样用问什么会通不过呢?哪位大神讲讲正确的用法 三角形 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28002 Accepted Submission(s): 9138 Problem Description 给定三条边,请你判断一下能不能组成一个三角形. Input 输入数据第一行包含

Sqlserver 8.00.2039 版本的存储过程怎么写try catch

问题描述 Sqlserver 8.00.2039 版本的存储过程怎么写try catch begindeclare @G_math ALTER PROCEDURE [dbo].[proc_test]ASbegindeclare @G_math varchar(30)set @G_math='2'_varchar(30)set @G_math='2'return '1'begin trybegin tran select 1commit tran end trybegin catchselect

fzu 1901 Period II

点击打开链接fzu 1901 思路:kmp+next数组的应用 分析: 1 题目要求的找到所有满足S[i]=S[i+P] for i in [0..SIZE(S)-p-1]的前缀,并且长度为p.利用上面的式子可以等价的得到等式s[0,len-p-1] = s[p , len-1]. 2 给个next数组的性质    假设现在有一个字符串为ababxxxxabab.那么求出的next数组为00012001234,那么前缀和后缀最长的匹配数是4,然后下一个前缀和后缀匹配长度为next[4] = 2

代码分析-FZU 2057 E 代码对给出的数据正确 递交为wa 求解

问题描述 FZU 2057 E 代码对给出的数据正确 递交为wa 求解 foj 我的代码 #include #include int fa[10000+10],ma[10000+10],ch[10000+10],n; void slove(int x,int y) { int t,zd,k=0,flag=0,i,var=0; char z[10000+5]; if(x { t=x; x=y; y=t; var=1; } while(x>y) { zd=ch[x]; if(x==fa[zd]) {

FZU 1752 a^b%c

题目连接:http://acm.fzu.edu.cn/problem.php?pid=1752 解题思路:要用快速幂,但不是单纯的用,如果单纯的用的话就会爆掉,要把乘法转化为加法,然后再用而且尽量用位运算... 上代码: #include <iostream> #include <cstdio> using namespace std; typedef long long LL; LL multi(LL a, LL b, LL c) { LL ans=0; a=a%c; while

fzu 2034 Password table

点击打开链接fzu 2034 思路:水题暴搞 注意:输出严格要求是01,而不是1所以输出的格式注意一下. 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 10 int T; int n , m , q; int G[N][N]; char str[N]; int main(){ scanf(

FZU 1692 Key problem

点击打开FZU 1692 思路: 构造矩阵+矩阵快速幂 分析: 1 题目的意思是有n个人构成一个圈,每个人初始的有ai个苹果,现在做m次的游戏,每一次游戏过后第i个人能够增加R*A(i+n-1)%n+L*A(i+1)%n 个苹果(题目有错),问m轮游戏过后每个人的苹果数 2 根据题目的意思我们能够列出一轮过后每个人的苹果数    a0 = a0+R*an-1+L*a1    a1 = a1+R*a0+L*a2    .............................    an-1 =

GTAT欠苹果4亿美元 卖2039台蓝宝石熔炉还债

10月22日消息,据国外媒体报道,<财富>资深编辑Philip Elmer-DeWitt周二出席了苹果蓝宝石供应商GT Advanced Technologies(后简称GTAT)的破产保护 听证会.根据其最新获知的消息,GTAT将通过向第三方公司出售2039台蓝宝石熔炉,来偿还拖欠苹果的剩余债款.苹果最初与GTAT签署合作协议时,曾向后者一次性支付了4.39亿美元用以购买蓝宝石屏幕.然而GTAT随后因产能无法满足要求,苹果撤销了最后一笔总额为1.39亿美元的有条件付款.GTAT也因此而不得不

谷歌删除了一款名为SuperPoke Pets的虚拟宠物游戏而对谷歌提出起诉

虚拟宠物游戏玩家的损失可能并不多,但从大的角度来说,这件案子将反映出法律对待正在蓬勃发展之中的虚拟货币市场的态度. SuperPoke Pets是一款在线宠物游戏,玩家可以选择一种宠物(狗.青蛙.绵羊等)来饲养.许多玩家用真钱购买了宠物社区的"金币"(虚拟货币),然后用金币购买游戏道具. 谷歌最初从一家名为Slide的公司购买了该游戏,但去年夏季决定将这款游戏从产品库中删除.对于谷歌来说,之前的虚拟"金币"已经毫无价值了. 谷歌此举引起了游戏玩家的愤怒,他们找了一家