HUD 2444 The Accomodation of Students (二分图染色+最大匹配)

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 2010
using namespace std;
int n,m,num,head[maxn],f[maxn],match[maxn],color[maxn];
struct node
{
    int u,v,pre;
}e[maxn*maxn];
void Add(int from,int to)
{
    num++;
    e[num].u=from;
    e[num].v=to;
    e[num].pre=head[from];
    head[from]=num;
}
bool Color(int s)
{
    for(int i=head[s];i;i=e[i].pre)
      if(!color[e[i].v])
        {
          color[e[i].v]=-1*color[s];
          if(!Color(e[i].v))return 0;
        }
      else if(color[e[i].v]==color[s])return 0;
    return 1;
}
int Dfs(int s)
{
    for(int i=head[s];i;i=e[i].pre)
      if(f[e[i].v]==0)
        {
          f[e[i].v]=1;
          if(match[e[i].v]==0||Dfs(match[e[i].v]))//XXXXX又是这句错了 下次再写错就XXXX
            {
              match[e[i].v]=s;
              return 1;
            }
        }
    return 0;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
      {
          num=0;
          memset(f,0,sizeof(f));
          memset(head,0,sizeof(head));
          memset(color,0,sizeof(color));
          memset(match,0,sizeof(match));
        int u,v;
        for(int i=1;i<=m;i++)
          {
              scanf("%d%d",&u,&v);
              Add(u,v);Add(v,u);
          }
        if(n==1)
            {
                printf("No\n");
                continue;
          }
        color[1]=1;
        if(!Color(1))
          {
              printf("No\n");
              continue;
          }
        int ans=0;
        for(int i=1;i<=n;i++)
          {
              memset(f,0,sizeof(f));
              ans+=Dfs(i);
          }
        printf("%d\n",ans/2);
      }
    return 0;
}
时间: 2024-08-06 11:56:50

HUD 2444 The Accomodation of Students (二分图染色+最大匹配)的相关文章

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二分图判定和匈牙利算法

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

HDOJ 题目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): 2943    Accepted Submission(s): 1376 Problem Description There are a group of students. Some of them may know each o

HDU 2444 The Accomodation of Students (二分图判定,二分图匹配,匈牙利算法)

题意:有一堆的学生关系,要将他们先分成两个组,同组的人都不互不认识,如果不能分2组,输出No.若能,则继续.在两组中挑两个认识的人(每组各1人)到一个双人房.输出需要多少个双人房? 思路: 先判定是否为二分图,可以用黑白着色法(DFS或BFS都行).若是二分图,再进行匹配,用匈牙利算法,注:给的是整个图,没有区分男女,用邻接表比较好. 1 #include <bits/stdc++.h> 2 #define LL long long 3 using namespace std; 4 const

POJ 2444 The Accomodation of Students 黑白染色+二分匹配 簡單題

有n個人,編號為1~n,其中有m對朋友,現在給出m對朋友,問能不能把這n個人分成2個組,使得每一個組裡面的人都是互相不認識的? 若不可以,輸出No 若可以,問現在將認識的人兩兩配對,輸出最多可以有多少對 說白了,這道題就是首先要判斷是不是二分圖,不是的話輸出No,是的話輸出最大匹配 判斷二分圖:用黑白染色法,注意,整個關係圖有可能是不連通的,所以要遍歷所有的點 這裡求最大匹配不是用匈牙利算法,而是直接轉化為最大流 1 #include<cstdio> 2 #include<cstring

Hdu_2444 The Accomodation of Students -二分图判断+最大匹配

题意:先判断学生能否分成两块互不认识的集体,然后找出这两块集体的最大匹配 吐槽:迷之WA了几次,后来把判断是否是二分图弄成函数写在外面就ok了. /************************************************ Author :DarkTong Created Time :2016/8/1 13:02:46 File Name :Hdu_2444.cpp *************************************************/ //#

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

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

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

【HDOJ】2444 The Accomodation of Students

图论的题目.着色原理+二分图匹配. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 205 5 6 char map[MAXN][MAXN]; 7 int link[MAXN]; 8 int color[MAXN]; 9 bool visit[MAXN]; 10 int n, m; 11 12 bool dfs(int v, int col) { 13 int i; 14 15 for (i=1; i<=n;