HDU 5285 wyh2000 and pupil (DFS染色判二分图 + 贪心)

wyh2000 and pupil

Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 1040    Accepted Submission(s): 331

Problem Description

Young theoretical computer scientist wyh2000 is teaching his pupils.

Wyh2000 has n pupils.Id of them are from 1
to n.In
order to increase the cohesion between pupils,wyh2000 decide to divide them into 2 groups.Each group has at least 1 pupil.

Now that some pupils don‘t know each other(if a
doesn‘t know b,then
b
doesn‘t know a).Wyh2000
hopes that if two pupils are in the same group,then they know each other,and the pupils of the first group must be as much as possible.

Please help wyh2000 determine the pupils of first group and second group. If there is no solution, print "Poor wyh".

Input

In the first line, there is an integer
T
indicates the number of test cases.

For each case, the first line contains two integers
n,m
indicate the number of pupil and the number of pupils don‘t konw each other.

In the next m lines,each line contains 2 intergers
x,y(x<y),indicates
that x
don‘t know y
and y
don‘t know x,the
pair (x,y)
will only appear once.

T≤10,0≤n,m≤100000

Output

For each case, output the answer.

Sample Input

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

Sample Output

5 3
Poor wyh

Source

BestCoder Round #48 ($)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5285

题目大意:一些人要分成两组,(这群人真的好累啊,一天到晚被分来分去),给出他们之间的不认识关系,两个不认识的人不能分到一组,且每组都要至少有一个人,问分完后两组人数的最大可能值和最小可能值

题目分析:题意化简一下,就是求几个独立的二分图(可能有单点不过不碍事)合成一个大二分图,使得大二分图两侧点数差的绝对值最大,显然这里用贪心思想,对每个二分图,我把点数大的那一侧的全部并起来作为大二分图的一侧,另一侧用n减即可,判断二分图和记录点数采用的是DFS染色法,注意几个wa点,n<2时肯定没法分,还有m等于0时,显然可以有n个平凡图,这种特殊情况下,因为每组至少有一个人,直接n-1和1即可

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 100005;
int n, m, cnt;
int head[MAX], color[MAX], num[2];
bool vis[MAX], flag;

struct EDGE
{
    int v, next;
}e[MAX * 2]; 

void Add(int u, int v)
{
    e[cnt].v = v;
    e[cnt].next = head[u];
    head[u] = cnt ++;
}

void DFS(int u, int col)
{
    vis[u] = true;
    color[u] = col;
    num[col] ++;
    for(int i = head[u]; i != -1; i = e[i].next)
    {
        int v = e[i].v;
        if(vis[v])
        {
            if(color[v] == color[u])
            {
                flag = true;
                return;
            }
        }
        else
            DFS(v, col ^ 1);
    }
    return;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T --)
    {
        memset(head, -1, sizeof(head));
        memset(color, -1, sizeof(color));
        memset(vis, false, sizeof(vis));
        cnt = 0;
        flag = false;
        scanf("%d %d", &n, &m);
        for(int i = 0; i < m; i++)
        {
            int u, v;
            scanf("%d %d", &u, &v);
            Add(u, v);
            Add(v, u);
        }
        if(n < 2)
        {
            printf("Poor wyh\n");
            continue;
        }
        if(m == 0)
        {
            printf("%d 1\n", n - 1);
            continue;
        }
        int ans = 0;
        for(int i = 1; i <= n; i++)
        {
            if(!vis[i])
            {
                memset(num, 0, sizeof(num));
                DFS(i, 0);
                if(flag)
                    break;
                ans += max(num[0], num[1]);
            }
        }
        if(flag)
            printf("Poor wyh\n");
        else
            printf("%d %d\n", ans, n - ans);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-21 03:29:26

HDU 5285 wyh2000 and pupil (DFS染色判二分图 + 贪心)的相关文章

HDU 5285 wyh2000 and pupil(dfs或种类并查集)

wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 755    Accepted Submission(s): 251 Problem Description Young theoretical computer scientist wyh2000 is teaching his pupils. Wy

Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)

题目链接: BestCoder Round #48 ($) 1002 题目描述: n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比二班的人数多,每个班的人数都大于零. 解题思路: hdu给出的题解是二分图匹配加上贪心,就不多说了. 还可以用bfs对节点染色,建好图后,对节点进行bfs分成,偶数成与奇数成染成不同的颜色,颜色相同的节点都可以分到同一个集合里面,但是要判断一下奇环,如果出现奇环的话,是无法进行分组的.在每次bfs的

hdu 5285 wyh2000 and pupil(二染色)

第一次用vector解得题,值得纪念,这道题是二染色问题,我用bfs解得,就是染色,判断,计数问题,其 实挺简单的,就是得判一下特殊情况,当n<2的时候就不能有解,因为题目要求每个组至少有一个人,当没有不认识的 人的时候就是一个组是n-1,另一个组人数为1 上代码: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<vector

HDU 5285 wyh2000 and pupil

题意:有一群人,已知某两人之间互相不认识,要把这群人分成两部分,每部分至少一人,且在每部分内没有人互不认识. 解法:图染色.某场bestcoder第二题……看完题觉得是个二分图……完全不会二分图什么的……但是为了挣扎一下百度了一下二分图的判定方法,知道了可以用染色法,这样如果是二分图的话将每个连通分量里点数量最多的颜色的点数量(像个绕口令诶)相加就可以了.然而激动万分的我早忘了还有每部分至少一人这个条件……直到我和队友研究怎么hack别人的时候他才告诉我还有这么个条件……(哭)还好来得及…… 代

HDU 5285 wyh2000 and pupil (二分图)

题意:共有n个小学生,编号为1−n.将所有小学生分成2组,每组都至少有1个人.但是有些小学生之间并不认识,而且如果a不认识b,那么b也不认识a.Wyh2000希望每组中的小学生都互相认识.而且第一组的人要尽可能多.请你帮wyh2000求出第一组和第二组的人数是多少.如果找不到分组方案,则输出"Poor wyh". 思路:二分图着色.给的就是无向图,每次都累加人多的颜色即可.若不能着色,必定不能分成2组.如果全部都是1个颜色,那么要让其中1人过第2组.我勒个去,就因为赭色时颜色号码开小了

hdu 5258 wyh2000 and pupil(dfs)(待续)

题意:n个点,m条边,每条边连接的两点颜色不同, 思路: #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; int t,n,m; vector<int>g[500010]; int vis[500010]; int cnt1,cnt2,sum; int dfs(int

hdu 5285 wyh2000 and pupil(二分图判定)

对每两个不认识的人连一条边,则此题可转化为二分图判定(二分图可有多个). 如果有一部分图判定为不是二分图,则输出“Poor wyh”. 否则,分别累加每个二分图的最多的颜色数. #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <stack> #include <cmat

hdu 5313 Bipartite Graph(dfs染色 或者 并查集)

Problem Description Soda has a bipartite graph with n vertices and m undirected edges. Now he wants to make the graph become a complete bipartite graph with most edges by adding some extra edges. Soda needs you to tell him the maximum number of edges

POJ 2942 Knights of the Round Table (点-双连通分量 + 交叉法染色判二分图)

POJ 2942 Knights of the Round Table 链接:http://poj.org/problem?id=2942 题意:亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: 1. 相互憎恨的两个骑士不能坐在直接相邻的2个位置: 2. 出席会议的骑士数必须是奇数,这是为了让投票表决议题时都能有结果. 如果出现有某些骑士无法出席所有会议(例如这个骑士憎恨所有的其他骑士),则亚瑟王为了世界和