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

题目大意:有一群人他们有一些关系,比如A认识B, B认识C, 但是这并不意味值A和C认识。现在给你所有互相认识的学生,你的任务是把所有的学生分成两个一组,

住在一个双人房里。相互认识的同学可以住在一个双人房里。

输入数据:

有n个学生 m个关系(m对是相互认识的)

接下来m行是,是m个关系。

如果能够匹配成功则输出需要双人房的个数,否则输出‘No‘

思路:先判断是否是个二分图,可以使用黑白染色的方法来判断。然后再进行最大匹配。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 500
bool G[maxn][maxn], vis[maxn];
int color[maxn], P[maxn];///黑白染色 -1 黑色  1 白色
int n, m;

bool DFS(int u,int c)///判断是否是二分图,黑白染色
{
    color[u] = c;
    for(int i=1; i<=n; i++)
    {
        if(!G[u][i] )
            continue;
        if(color[i] == 0)
        {
            if( DFS(i, -c) )
                continue;
            return false;
        }
        else if(color[i] + color[u])
            return false;

    }
    return true;
}
bool Find(int u)
{
    for(int i=1; i<=n; i++)
    {
        if(G[u][i] && !vis[i])
        {
            vis[i] = true;
            if(P[i] == -1 || Find(P[i]))
            {
                P[i] = u;
                return true;
            }
        }
    }
    return false;
}

int solve()
{
    bool ok;
    for(int i=1; i<=n; i++)
    {
        if(color[i] == 0)
            ok = DFS(i, 1);
        if(ok == false)
            return -1;
    }

    int ans = 0;
    for(int i=1; i<=n; i++)
    {
        memset(vis, false, sizeof(vis));
        if(color[i] && Find(i))
            ans ++;
    }
    return ans;
}

int main()
{
    while(scanf("%d %d",&n, &m) != EOF)
    {
        int a, b;
        memset(G, false, sizeof(G));
        memset(P, -1, sizeof(P));
        memset(color, 0, sizeof(color));

        for(int i=0; i<m; i++)
        {
            scanf("%d %d",&a, &b);
            G[a][b] = true;
        }
        int ans = solve();

        if(ans == -1)
            puts("No");
        else
            printf("%d\n", ans );
    }
    return 0;
}
时间: 2025-01-19 00:40:49

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) 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 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 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 判断时候构成二分图 + 最大匹配

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

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.split.hdu.edu.cn/showproblem.php?pid=2444 Problem 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 and C know each other. But this may not imply t