博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ 2444 The Accomodation of Students
阅读量:4968 次
发布时间:2019-06-12

本文共 2856 字,大约阅读时间需要 9 分钟。

 
染色判读二分图+Hungary匹配

The Accomodation of Students

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1705    Accepted Submission(s): 821


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
 

Recommend
gaojie
 
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
typedef struct
{
    int to,next;
}Edge;
Edge E[50000];
int Adj[50000],Size=0,color[500],n,m,from[500];
bool use[500];
void Init()
{
    Size=0;
    memset(Adj,-1,sizeof(Adj));
}
void Add_Edge(int u,int v)
{
    E[Size].to=v;
    E[Size].next=Adj;
    Adj=Size++;
}
bool match(int x)
{
    for(int i=Adj[x];~i;i=E.next)
    {
        int v=E.to;
        if(!use[v])
        {
            use[v]=true;
            if(from[v]==-1||match(from[v]))
            {
                from[v]=x;
                return true;
            }
        }
    }
    return false;
}
int hungary()
{
    int sum=0;
    memset(from,-1,sizeof(from));
    for(int i=1;i<=n;i++)
    {
        if(color==1)
        {
            memset(use,false,sizeof(use));
            sum+=match(i);
        }
    }
    return sum;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int u,v;
        Init();
        while(m--)
        {
            scanf("%d%d",&u,&v);
            Add_Edge(u,v);
            Add_Edge(v,u);
        }
        memset(color,0,sizeof(color));
        bool flag=true;
while(true)
{
        int pos=-1;
        if(flag==falsebreak;
        for(int i=1;i<=n;i++)
        {
            if(Adj==-1continue;
            else if(color!=0continue;
            else
            {
                pos=i; break;
            }
        }
        if(pos==-1break;
        queue<int> q;
        q.push(pos); color[pos]=1;
        //printf("%d: \n",pos);
        while(!q.empty())
        {
            if(flag==falsebreak;
            int u=q.front(); q.pop();
            for(int i=Adj;~i;i=E.next)
            {
                int v=E.to;
                //printf("%d--->%d\n",u,v);
                if(color[v]==0)
                {
                    color[v]=-color;
                    q.push(v);
                }
                else if(color[v]==color)
                {
                    flag=falsebreak;
                }
            }
        }
}
        if(flag==false)
        {
            puts("No");
        }
        else
        {
            printf("%d\n",hungary());
        }
    }
    return 0;
}
* This source code was highlighted by . ( style: Codeblocks )

转载于:https://www.cnblogs.com/CKboss/p/3350832.html

你可能感兴趣的文章
tomcat的下载和启动
查看>>
java中new关键字解析
查看>>
babel吐槽
查看>>
python_11 装饰器,闭包
查看>>
Qt历史版本下载网址
查看>>
dede调取文章内容的第一张图片
查看>>
jsp页面数据保留两位小数
查看>>
利用Struts2拦截器完成文件上传功能
查看>>
《剑指Offer》算法题——替换空格
查看>>
【洛谷 1908】逆序对
查看>>
codeforces 764 C. Timofey and a tree(dfs+思维)
查看>>
$.each遍历json对象
查看>>
轻松搞定面试中的链表题目
查看>>
angular.module()创建、获取、注册angular中的模块
查看>>
[转载] nginx的负载均衡
查看>>
第四周课下作业(考试补齐)
查看>>
本月,下一月, 上一月 的 1号, 最后一号
查看>>
C_文件包含.h文件和包含.c文件总结
查看>>
mockIto
查看>>
DIB位图(Bitmap)的读取和保存
查看>>