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 other, while others don‘t. For example, A and B know each other, B and C know each other. But this may not imply that A and C know each other.

Now you are given all pairs of students who know each other. Your task is to divide the students into two groups so that any two students in the same group don‘t know each other.If this goal can be achieved, then arrange them into double rooms. Remember, only
paris appearing in the previous given set can live in the same room, which means only known students can live in the same room.

Calculate the maximum number of pairs that can be arranged into these double rooms.

Input

For each data set:

The first line gives two integers, n and m(1<n<=200), indicating there are n students and m pairs of students who know each other. The next m lines give such pairs.

Proceed to the end of file.

Output

If these students cannot be divided into two groups, print "No". Otherwise, print the maximum number of pairs that can be arranged in those rooms.

Sample Input

4 4
1 2
1 3
1 4
2 3
6 5
1 2
1 3
1 4
2 5
3 6

Sample Output

No
3

Source

2008 Asia Harbin Regional Contest Online

Recommend

gaojie   |   We have carefully selected several similar problems for you:  2443 2442 2441 2440 2439

ac代码

#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int color[205],vis[205],link[205];
int n,m;
vector<int>vt[205];
int dfs(int u,int c)
{
    if(color[u]==0)
    {
        color[u]=c;
    }
    else
    {
        if(color[u]==c)
            return 0;
        return 1;
    }
    for(int i=0;i<vt[u].size();i++)
    {
        int v=vt[u][i];
        if(dfs(v,-c))
            return 1;
    }
    return 0;
}
int jud()
{
    int i;
    memset(color,0,sizeof(color));
    for(i=1;i<=n;i++)
    {
        if(!color[i])
            if(dfs(i,1))
                return 0;
    }
    return 1;
}
int dfs(int u)
{
    for(int i=0;i<vt[u].size();i++)
    {
        int v=vt[u][i];
        if(!vis[v])
        {
            vis[v]=1;
            if(link[v]==-1||dfs(link[v]))
            {
                link[v]=u;
                return 1;
            }
        }
    }
    return 0;
}
int main()
{
    //int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int i;
        for(i=0;i<=n;i++)
            vt[i].clear();
        for(i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            vt[u].push_back(v);
            vt[v].push_back(u);
        }
        if(!jud())
        {
            printf("No\n");
            continue;
        }
        int ans=0;
        memset(link,-1,sizeof(link));
        for(i=1;i<=n;i++)
        {
            memset(vis,0,sizeof(vis));
            if(dfs(i))
                ans++;
        }
        printf("%d\n",ans/2);
    }
}
时间: 2024-10-10 07:40:17

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

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

【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;

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(判断是否是二分图)

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

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

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 【二分图判断+求最大匹配】

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