博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hiho一下第133周 2-SAT·hihoCoder音乐节(2-SAT)(强连通)
阅读量:5738 次
发布时间:2019-06-18

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

2-SAT·hihoCoder音乐节

时间限制:
10000ms
单点时限:
1000ms
内存限制:
256MB

描述

hihoCoder音乐节由hihoCoder赞助商大力主办,邀请了众多嘉宾和知名乐队参与演出。

音乐会分为上午、下午两场进行,主办方指定了n首歌让乐队进行演唱。每首歌只会被演唱一次,要么在上午要么在下午。

参加音乐会的嘉宾们对于歌曲的演唱时间有一些要求。具体来说,每位嘉宾会指定两首歌曲的演唱时间(上午或者下午)。如果最后实际的演出安排中,两首歌都没有达到嘉宾的要求,那么嘉宾就会对音乐节不滿意。如嘉宾A的要求是上午《我的滑板鞋》和下午《忐忑》,而最后的演出中上午没有《我的滑板鞋》只有《忐忑》,下午没有《忐忑》只有《我的滑板鞋》,那么嘉宾A是不满意的。

音乐节主办方自然希望使所有嘉宾满意,但主办方后来发现有可能不存在一种歌曲的安排方案满足所有嘉宾,所以他们希望你判断一下这种情况是否会发生。

输入

输入第一行包含一个数字 K,代表K组数据。(K≤50)

对于每一组数据,第一行包含两个非负整数n和m(n≤100,m≤1000),代表有n首歌和m位嘉宾。

为了方便我们给予歌编号,编号分别从1 到n。接下的m行,每行都代表对应的嘉宾的喜好由一个英文字母(m或h)跟一个数字代表,如m1 代表这个评审喜欢第1首歌上午进行,而h2代表这个评审员喜欢第2首歌下午进行。

输出

对于每一组数据,输出一行,如果能满足所有嘉宾的情况,输出GOOD;否则输出BAD。

样例输入
23 4m3 h1m1 m2h1 h3h3 m22 4h1 m2m2 m1h1 h2m1 h2
样例输出
GOODBAD
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define met(a,b) memset(a,b,sizeof a)#define pb push_backusing namespace std;const int N=2e3+50;const int M=N*N+10;int n,m,k,s,t,tot,cut=0,tim=0,top=0;int head[N],vis[N];int dfn[N],low[N],stack1[N],num[N];struct man { int to,next;} edg[M];void add(int u,int v) { //printf("!!!%d %d\n",u,v); edg[tot].to=v; edg[tot].next=head[u]; head[u]=tot++;}void Tarjan(int u) { int v; low[u] = dfn[u] = ++tim; stack1[top++] = u; vis[u] = 1; for(int e = head[u]; e != -1; e = edg[e].next) { v = edg[e].to; if(!dfn[v]) { Tarjan(v); low[u] = min(low[u], low[v]); } else if(vis[v]) { low[u] = min(low[u], dfn[v]); } } if(low[u] == dfn[u]) { cut++; do { v = stack1[--top]; num[v] = cut; vis[v] = 0; } while(u != v); }}void init(){ tot=top=cut=tim=0; met(head,-1); met(low,0); met(dfn,0);met(vis,0);met(num,0);}int main() { int t,A,B; char a,b; scanf("%d",&t); while(t--){ init(); bool ok=true; scanf("%d%d",&n,&m); while(m--){ scanf(" %c%d %c%d",&a,&A,&b,&B); int An=A+n; int Bn=B+n; if(a=='h')swap(A,An); if(b=='h')swap(B,Bn); add(An,B);add(Bn,A); } for(int i=1;i<=2*n;i++)if(!dfn[i])Tarjan(i); for(int i=1;i<=n;i++){ if(num[i]==num[i+n]){ ok=false; break; } } if(ok)puts("GOOD"); else puts("BAD"); } return 0;}

 

转载于:https://www.cnblogs.com/jianrenfang/p/6349835.html

你可能感兴趣的文章
实现java导出文件弹出下载框让用户选择路径
查看>>
刨根问底--技术--jsoup登陆网站
查看>>
OSChina 五一劳动节乱弹 ——女孩子晚上不要出门,发生了这样的事情
查看>>
Spring--通过注解来配置bean
查看>>
pandas 十分钟入门
查看>>
nginx rewrite
查看>>
前端安全系列(一):如何防止XSS攻击?
查看>>
IK分词器安装
查看>>
查看Linux并发连接数
查看>>
你是谁不重要,关键是你跟谁!
查看>>
CSS中规则@media的用法
查看>>
pychecker:分析你的python代码
查看>>
css 默认不显示 之后显示
查看>>
我的友情链接
查看>>
DNS显性+隐性URL转发原理
查看>>
我的友情链接
查看>>
网易有道 IP地址、手机号码归属地和身份证 查询接口API
查看>>
鼠标停留在GridView某一行时行的颜色改变
查看>>
系列3:WAS Liberty Profile hello mysql jdbc
查看>>
基础知识:python模块的导入
查看>>