hdu 5971 Wrestling Match(队列)

本文介绍了一个比赛场景下的分组判定问题,通过构建图结构并利用队列进行广度优先搜索来解决好人与坏人的区分问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Wrestling Match

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 19    Accepted Submission(s): 13



Problem Description
Nowadays, at least one wrestling match is held every year in our country. There are a lot of people in the game is "good player”, the rest is "bad player”. Now, Xiao Ming is referee of the wrestling match and he has a list of the matches in his hand. At the same time, he knows some people are good players,some are bad players. He believes that every game is a battle between the good and the bad player. Now he wants to know whether all the people can be divided into "good player" and "bad player".
 

Input
Input contains multiple sets of data.For each set of data,there are four numbers in the first line:N (1 ≤ N≤ 1000)、M(1 ≤M ≤ 10000)、X,Y(X+Y≤N ),in order to show the number of players(numbered 1toN ),the number of matches,the number of known "good players" and the number of known "bad players".In the next M lines,Each line has two numbersa, b(a≠b) ,said there is a game between a and b .The next line has X different numbers.Each number is known as a "good player" number.The last line contains Y different numbers.Each number represents a known "bad player" number.Data guarantees there will not be a player number is a good player and also a bad player.
 

Output
If all the people can be divided into "good players" and "bad players”, output "YES", otherwise output "NO".
 

Sample Input
  
5 4 0 0 1 3 1 4 3 5 4 5 5 4 1 0 1 3 1 4 3 5 4 5 2
 

Sample Output
  
NO YES
 

Source
2016ACM/ICPC亚洲区大连站-重现赛(感谢大连海事大学)

题意:给你n个人,m场比赛,x个好人,y个坏人,对于每一场比赛,必有一个好人一个坏人,问是否能将n个人完全区分成好坏人。

思路:题意相当模糊,综合样例可以推测为不能有单独的人可以判成好坏人,那就很好做了,首先对已给的人对比赛进行推测区分出一些人,对无法区分的人,随便给个属性进行递推,唯一注意的就是对单独的人又没给出属性的情况下可以直接判断no.这题没什么好说的,水题罢了,若是wa了,必定是姿势不对,若是tle了,那是链式前向星的数组开小了。

代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1111;
struct node
{
    int u,v,next;
}edge[maxn*10*2];
struct E
{
    int w,id;
};
queue<E>q;
int head[maxn],cnt,vis[maxn];
void addedge(int u,int v)
{
    edge[cnt].u=u;edge[cnt].v=v;edge[cnt].next=head[u];head[u]=cnt++;
    edge[cnt].u=v;edge[cnt].v=u;edge[cnt].next=head[v];head[v]=cnt++;
}
int main()
{
    int T;
    int n,m,x,y;
    while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
    {
        cnt=0;
        memset(head,-1,sizeof(head));
        memset(vis,-1,sizeof(vis));
        for(int i=0;i<m;i++)
        {
            int c,d;
            scanf("%d%d",&c,&d);
            addedge(c,d);
        }
        int xx;
        E a;
        int flag=0;
        while(!q.empty())
            q.pop();
        for(int i=0;i<x;i++)
        {
            scanf("%d",&xx);
            a.w=xx;
            a.id=0;
            vis[xx]=0;
            q.push(a);
        }
        for(int i=0;i<y;i++)
        {
            scanf("%d",&xx);
            vis[xx]=1;
            a.w=xx;
            a.id=1;
            q.push(a);
        }
        while(!q.empty())   //有给出的好坏人去区分比赛中的好坏人。
        {
            a=q.front();q.pop();
            int u=a.w,id=a.id;
            for(int i=head[u];i!=-1;i=edge[i].next)
            {
                int v=edge[i].v;
                if(vis[v]==-1)
                {
                    vis[v]=!vis[u];
                    a.w=v;
                    a.id=vis[v];
                    q.push(a);
                }
                else if(vis[v]==vis[u])
                {
                    flag=1;
                    break;
                }
            }
        }
        if(!flag)
        for(int i=1;i<=n;i++)   //无法区分的好坏人,先判断是否是独立的个体,是则直接no,否则任意标记一个属性,进行再一轮推断。
        {
            if(vis[i]==-1)
            {
                if(flag)
                    break;
                if(head[i]==-1)
                {
                    flag=1;break;
                }
                vis[i]=0;
                a.w=i;
                a.id=0;
                q.push(a);
                while(!q.empty())
                {
                    a=q.front();q.pop();
                    int u=a.w,id=a.id;
                    for(int j=head[u];j!=-1;j=edge[j].next)
                    {
                        int v=edge[j].v;
                        if(vis[v]==-1)
                        {
                           vis[v]=!vis[u];
                           a.w=v;
                           a.id=vis[v];
                           q.push(a);
                        }
                        else if(vis[v]==vis[u])
                        {
                            flag=1;
                            break;
                        }
                     }
                }
            }
        }
        if(flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}


HDU 3732 (Queue) 是一个经典的队列操作题目,在这个题目的设定下,你需要处理一系列关于入队、出队的操作,并最终输出特定的结果。这类问题通常会涉及到数据结构中的“队列”这一概念。 ### 题目概述 在 HDU 3732 中,你将面对的是一个标准的队列入栈和出栈的问题变种。它可能会给出一些序列化的指令集,包括: - 入队(push) - 出队(pop) 并且最后询问某些元素的状态或顺序等信息。 ### 解决思路 为了应对这个问题,你可以采用双端队列的数据结构或者两个栈模拟队列的方式来解决问题。以下是具体的步骤: 1. **初始化**:创建所需的辅助变量及容器,如 `queue` 或者一对用于模拟队列行为的栈 (`stackIn`, `stackOut`)。 2. **处理命令流**:遍历输入命令列表,根据不同类型的命令做相应动作: - 对于每一个 push 操作直接添加到指定位置; - 当遇到 pop 命令,则从头部移除元素;如果是用栈实现的话需要特殊处理,比如先全部倒入另一个栈再弹出顶部元素作为当前最先进来的那个值被移走。 3. **生成结果**:按照题目要求整理并返回正确的输出内容。 4. **注意事项** - 确保每次只对有效范围内的索引执行插入/删除操作。 - 考虑边界条件,例如空队列出队等情况下的异常处理。 ### 示例代码片段(Python 实现) ```python from collections import deque def process_queue_commands(commands): queue = deque() for command in commands: if "in" == command[0]: value = int(command.split()[1]) queue.append(value) elif "out" == command and len(queue)>0: print("Pop element:", queue.popleft()) # 示例用法 commands = ["5", "in 8", "in 9", "out"] process_queue_commands(commands[1:]) ``` 请注意实际比赛中给定的具体细节可能有所差异,请参考原题描述进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值