hdu 2444 The Accomodation of Students 判断时候构成二分图 + 最大匹配

  此题就是求最大匹配。不过需要判断是否构成二分图。判断的方法是人选一点标记为红色(0),与它相邻的点标记为黑色(1),产生矛盾就无法构成二分图。声明一个vis[],初始化为-1。通过深搜,相邻的点不满足异或关系就结束。如果没被标记,就标记为相邻点的异或。

  

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 using namespace std;
  7 const int N=205,INF=0x3f3f3f3f;
  8 int bmap[N][N],cx[N],cy[N],dx[N],dy[N];
  9 bool bmask[N];
 10 int flag,vis[N];
 11 int nx,ny,dis,ans;
 12 bool searchpath()
 13 {
 14     queue<int> q;
 15     dis=INF;
 16     memset(dx,-1,sizeof(dx));
 17     memset(dy,-1,sizeof(dy));
 18     for(int i=1;i<=nx;i++)
 19     {
 20         if(cx[i]==-1){ q.push(i); dx[i]=0; }
 21         while(!q.empty())
 22         {
 23             int u=q.front(); q.pop();
 24             if(dx[u]>dis) break;
 25             for(int v=1;v<=ny;v++)
 26             {
 27                 if(bmap[u][v]&&dy[v]==-1)
 28                 {
 29                     dy[v]= dx[u] + 1;
 30                     if(cy[v]==-1) dis=dy[v];
 31                     else
 32                     {
 33                         dx[cy[v]]= dy[v]+1;
 34                         q.push(cy[v]);
 35                     }
 36                 }
 37             }
 38         }
 39     }
 40     return dis!=INF;
 41 }
 42 int findpath(int u)
 43 {
 44     for(int v=1;v<=ny;v++)
 45     {
 46         if(!bmask[v]&&bmap[u][v]&&dy[v]==dx[u]+1)
 47         {
 48             bmask[v]=1;
 49             if(cy[v]!=-1&&dy[v]==dis) continue;
 50             if(cy[v]==-1||findpath(cy[v]))
 51             {
 52                 cy[v]=u; cx[u]=v;
 53                 return 1;
 54             }
 55         }
 56     }
 57     return 0;
 58 }
 59 void maxmatch()
 60 {
 61     ans=0;
 62     memset(cx,-1,sizeof(cx));
 63     memset(cy,-1,sizeof(cy));
 64     while(searchpath())
 65     {
 66         memset(bmask,0,sizeof(bmask));
 67         for(int i=1;i<=nx;i++)
 68             if(cx[i]==-1) ans+=findpath(i);
 69     }
 70 }
 71 void init()
 72 {
 73     memset(bmap,0,sizeof(bmap));
 74 }
 75 void dfs(int u)
 76 {
 77     for(int i=1;i<=nx&&!flag;i++)
 78     {
 79         if(u==i) continue;
 80         if(bmap[u][i]){
 81             if(vis[i]!=-1&&(vis[u]^vis[i]!=1)) flag=1;
 82             if(vis[i]==-1) {vis[i]=vis[u] ^1;dfs(i);}
 83         }
 84     }
 85 }
 86 int main()
 87 {
 88     //freopen("test.txt","r",stdin);
 89     int cas,i,j,k,m,n;
 90     while(scanf("%d%d",&n,&m)!= EOF)
 91     {
 92         init();
 93         memset(vis,-1,sizeof(vis));
 94         flag=0;
 95         for(i=1;i<=m;i++)
 96         {
 97             scanf("%d%d",&j,&k);
 98             bmap[j][k]=1;
 99         }
100         nx=ny=n;
101         vis[1]=0;
102         dfs(1);
103         if(flag) {printf("No\n");continue;}
104         maxmatch();
105         printf("%d\n",ans);
106     }
107     return 0;
108 }

时间: 2024-10-08 06:50:39

hdu 2444 The Accomodation of Students 判断时候构成二分图 + 最大匹配的相关文章

hdu 2444 The Accomodation of Students 判断是否为二分图+最大匹配

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3042    Accepted Submission(s): 1425 Problem Description There are a group of students. Some of them may know each o

HDU 2444 The Accomodation of Students (判断是否是二分图,然后求最大匹配)

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Description There are a group of students. Some of them may know each other, while others don't. For example, A and B know each other, B

hdu 2444 The Accomodation of Students (判断二分图,最大匹配)

The Accomodation of StudentsTime Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8939    Accepted Submission(s): 3925 Problem DescriptionThere are a group of students. Some of them may know each othe

HDU 2444 The Accomodation of Students(判断是否是二分图)

题目链接 题意:n个学生,m对关系,每一对互相认识的能住一个房间.问否把这些学生分成两组,要求每组的学生都互不认识.求最多需要多少个房间. 是否能分成两组?也就是说判断是不是二分图,判断二分图的办法,用染色法 把初始点染成黑色,然后与之相连的染成白色,重复,使路径黑白相间, 如果当前点的颜色和与他相连点的颜色相同时,则说明这个图不是二分图 求最多需要多少个房间?也就是求最大匹配数. #include <iostream> #include <cstdio> #include <

hdu 2444 The Accomodation of Students

The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2458    Accepted Submission(s): 1177 Problem Description There are a group of students. Some of them may know each ot

HDU 2444 The Accomodation of Students二分图判定和匈牙利算法

本题就是先判断是否可以组成二分图,然后用匈牙利算法求出最大匹配. 到底如何学习一种新算法呢? 我也不知道什么方法是最佳的了,因为看书本和大牛们写的匈牙利算法详细分析,看了差不多两个小时没看懂,最后自己直接看代码,居然不到半个小时看懂了.然后就可以直接拿来解题啦. 比如topcoder上有这个算法的很详细的分析,真没看懂. 代码居然比分析更清晰了?我也不好下结论. 但是我觉得主要的思想还是有作用的. 说说我对这个算法的理解吧: 1 假设二分图分为两个集合 U, V,那么从一个集合U出发 2 U的一

HDU 2444 The Accomodation of Students 二分图判定+最大匹配

题目来源:HDU 2444 The Accomodation of Students 题意:n个人是否可以分成2组 每组的人不能相互认识 就是二分图判定 可以分成2组 每组选一个2个人认识可以去一个双人间 最多可以有几组 思路:二分图判定+最大匹配 #include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 550; int vis[maxn];

hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)

http://acm.hdu.edu.cn/showproblem.php?pid=2444 The Accomodation of Students Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2444 Description There are a group of students. Some of them may know

hdu 2444 The Accomodation of Students 【二分图判断+求最大匹配】

题目链接:http://acm.acmcoder.com/showproblem.php?pid=2444 题意:判断所有人是否分为两个集合,每个集合里的人互不相识. 思路:先判断是否为二分图,是的话求最大匹配,否则输出"No". 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #i