CODEVS1022 覆盖 (二分图染色+匈牙利算法)

先对整幅图进行二分图染色,再跑一遍匈牙利算法。

  1 /* CODEVS1022 */
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <cmath>
  6
  7 #define maxn 10008
  8
  9 struct edge{
 10     int u,v,next;
 11 }eg[maxn*4];
 12
 13 int dx[4]={0,0,1,-1};
 14 int dy[4]={1,-1,0,0};
 15 int a[108][108];
 16 int cl[maxn];
 17 int n,m,k,sum,ans;
 18 int last[maxn],l[maxn];
 19 bool pd[maxn];
 20
 21 void dfs(int i,int j,int w)
 22 {
 23     int x,y,k;
 24     cl[a[i][j]]=w;
 25     for (k=0;k<4;k++)
 26     {
 27         int x,y;
 28         x=i+dx[k];
 29         y=j+dy[k];
 30         if ((a[x][y]!=-1)&&!cl[a[x][y]])
 31             dfs(x,y,3-w);
 32     }
 33 }
 34 void add(int u,int v)
 35 {
 36     eg[++sum].u=u;
 37     eg[sum].v=v;
 38     eg[sum].next=last[u];
 39     last[u]=sum;
 40 }
 41 bool find(int u)
 42 {
 43     for (int i=last[u];i;i=eg[i].next)
 44     {
 45         int v=eg[i].v;
 46         if (!pd[v])
 47         {
 48             pd[v]=1;
 49             if ((!l[v])||find(l[v]))
 50             {
 51                 l[v]=u;
 52                 return 1;
 53             }
 54         }
 55     }
 56     return 0;
 57 }
 58 int main()
 59 {
 60     int i,j,k;
 61     sum=0;
 62     memset(a,-1,sizeof(a));
 63     scanf("%d%d%d",&m,&n,&k);
 64     for (i=1;i<=m;i++)
 65         for (j=1;j<=n;j++)
 66             a[i][j]=(i-1)*n+j;
 67     for (int i=1;i<=k;i++)
 68     {
 69         int x,y;
 70         scanf("%d",&x);
 71         if (x==0) break;
 72         scanf("%d",&y);
 73         a[x][y]=-1;
 74     }
 75     for (i=1;i<=m;i++)
 76         for (j=1;j<=n;j++)
 77         if ((a[i][j]!=-1)&&!cl[a[i][j]])
 78             dfs(i,j,1);
 79     for (i=1;i<=m;i++)
 80         for (j=1;j<=n;j++)
 81             if (cl[a[i][j]]) for (k=0;k<4;k++)
 82             {
 83                 int x,y;
 84                 x=i+dx[k];
 85                 y=j+dy[k];
 86                 if ((a[x][y]!=-1)&&cl[a[x][y]])
 87                     add(a[i][j],a[x][y]);
 88             }
 89     ans=0;
 90     memset(l,0,sizeof(l));
 91     for (i=1;i<=m*n;i++)
 92         if (cl[i]==1)
 93         {
 94             memset(pd,0,sizeof(pd));
 95             if (find(i)) ans++;
 96         }
 97     //for (i=1;i<=m*n;i++) printf("%d ",l[i]);
 98     printf("%d",ans);
 99     return 0;
100 }
时间: 2024-12-22 16:18:38

CODEVS1022 覆盖 (二分图染色+匈牙利算法)的相关文章

BZOJ1443 游戏game (二分图染色+匈牙利算法)

先对整幅图进行二分图染色,再跑一遍匈牙利算法.如果最大匹配数=点数*2,那么输出WIN. 对于任何一个非必须在最大匹配上的点,即为所求的点. 1 Program Test375num2; 2 type arr=record 3 u,v,next:longint; 4 end; 5 const dx:array[1..4] of longint=(0,0,-1,1); 6 dy:array[1..4] of longint=(1,-1,0,0); 7 maxn=100008; 8 maxm=max

HDU1507 Uncle Tom&#39;s Inherited Land* 二分图匹配 匈牙利算法 黑白染色

原文链接http://www.cnblogs.com/zhouzhendong/p/8254062.html 题目传送门 - HDU1507 题意概括 有一个n*m的棋盘,有些点是废的. 现在让你用1*2的矩形覆盖所有的不废的点,并且不重叠,问最多可以覆盖多少个1*2的矩形,输出方案,有SPJ. 输入描述: 多组数据,每组首先两个数n,m(如果n和m为0,则结束程序) 然后给出k 然后给出k个二元组(x,y)表示废点的坐标. 题解 按照前两片博文的算法已经不行了,因为方案不对了. 所以我们要进行

POJ1274:The Perfect Stall(二分图最大匹配 匈牙利算法)

The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17895   Accepted: 8143 Description Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering pr

USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the first week, Farmer John r

HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very

Ural1109_Conference(二分图最大匹配/匈牙利算法/网络最大流)

解题报告 二分图第一题. 题目描述: 为了参加即将召开的会议,A国派出M位代表,B国派出N位代表,(N,M<=1000) 会议召开前,选出K队代表,每对代表必须一个是A国的,一个是B国的; 要求每一个代表要与另一方的一个代表联系,除了可以直接联系,也可以电话联系,求电话联系最少 思路: 电话联系最少就要使直接联系最大,又是一一匹配关系,就是二分图的最大匹配. 下面是匈牙利算法. #include <cstdio> #include <cstring> #include <

UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法

二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> u

POJ1274 The Perfect Stall 二分图,匈牙利算法

N头牛,M个畜栏,每头牛只喜欢其中的某几个畜栏,但是一个畜栏只能有一只牛拥有,问最多可以有多少只牛拥有畜栏. 典型的指派型问题,用二分图匹配来做,求最大二分图匹配可以用最大流算法,也可以用匈牙利算法,这里使用匈牙利算法. #include <stdlib.h> #include <stdio.h> #include <vector> #include <math.h> #include <string.h> #include <string

过山车(二分图_匈牙利算法)

Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner.考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿