hdu 5971 Wrestling Match(队列)

来源:互联网 发布:全国网络平台监管系统 编辑:程序博客网 时间:2024/06/06 06:53

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 01 31 43 54 55 4 1 01 31 43 54 52
 

Sample Output
NOYES
 

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


1 0
原创粉丝点击