One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So, one day I was talking to him, about his drinks! He began to describe his way of drinking. So, let me share his ideas a bit. I am expressing in my words.

There are many kinds of drinks, which he used to take. But there are some rules; there are some drinks that have some pre requisites. Suppose if you want to take wine, you should have taken soda, water before it. That's why to get real drunk is not that easy.

Now given the name of some drinks! And the prerequisites of the drinks, you have to say that whether it's possible to get drunk or not. To get drunk, a person should take all the drinks.

Input

Input starts with an integer T (≤ 50), denoting the number of test cases.

Each case starts with an integer m (1 ≤ m ≤ 10000). Each of the next m lines will contain two names each in the format a b, denoting that you must have a before havingb. The names will contain at most 10 characters with no blanks.

Output

For each case, print the case number and 'Yes' or 'No', depending on whether it's possible to get drunk or not.

Sample Input

Output for Sample Input

2

2

soda wine

water wine

3

soda wine

water wine

wine water

Case 1: Yes

Case 2: No


PROBLEM SETTER: JANE ALAM JAN:
思路:直接拓扑排序判断有无环,复杂度O(N+E)
 1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<queue>
6 #include<vector>
7 #include<string.h>
8 #include<math.h>
9 #include<map>
10 #include<vector>
11 char str1[20];
12 char str2[20];
13 int cnt[200005];
14 int top(int ans,int nn,int k);
15 using namespace std;
16 vector<int>vec[20005];
17 int main(void)
18 {
19 int i,j,k,p,q;
20 int s;
21 scanf("%d",&k);
22 for(s=1; s<=k; s++)
23 {
24 map<string,int>my;
25 memset(cnt,0,sizeof(cnt));
26 scanf("%d",&p);
27 int ans=1;
28 for(i=0; i<20004; i++)
29 vec[i].clear();
30 for(i=0; i<p; i++)
31 {
32 scanf("%s %s",str1,str2);
33 if(my[str1]==0)
34 {
35 my[str1]=ans++;
36 }
37 if(my[str2]==0)
38 {
39 my[str2]=ans++;
40 }
41 vec[my[str1]].push_back(my[str2]);
42 cnt[my[str2]]++;
43 }
44 int ss=top(ans-1,0,ans-1);
45 printf("Case %d: ",s);
46 if(ss)printf("Yes\n");
47 else printf("No\n");
48 }
49 return 0;
50 }
51 int top(int ans,int nn,int k)
52 {
53 int i,j;
54 queue<int>que;
55 for(i=1; i<=ans; i++)
56 if(cnt[i]==0)
57 {
58 nn++;
59 que.push(i);
60 }
61 while(!que.empty())
62 {
63 int y=que.front();
64 que.pop();
65 for(i=0; i<vec[y].size(); i++)
66 {
67 cnt[vec[y][i]]--;
68 if(cnt[vec[y][i]]==0)
69 {
70 nn++;
71 que.push(vec[y][i]);
72 }
73 }
74 }
75 if(nn==k)return 1;
76 else return 0;
77 }

LightOJ - 1003 Drunk的更多相关文章

  1. Lightoj 1003 - Drunk(拓扑排序判断是否有环 Map离散化)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1003 题意是有m个关系格式是a b:表示想要和b必须喝a,问一个人是否喝醉就看一个人是 ...

  2. Lightoj 1003 - Drunk(拓扑排序)

    One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...

  3. Loj 1003–Drunk(拓扑排序)

    1003 - Drunk PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB One of my fr ...

  4. lightoj 1003

    有向图拓扑排序,判段是否存在. #include<map> #include<cstdio> #include<string> #include<cstrin ...

  5. lightoj刷题日记

    提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...

  6. lightoj 1381 - Scientific Experiment dp

    1381 - Scientific Experiment Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lightoj.com/vo ...

  7. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  8. Bestcoder#5 1003

    Bestcoder#5 1003 Poor RukawTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  9. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

随机推荐

  1. 简述安霸pipeline及其关键参数--raw域模块

    何为pipeline: sensor输出是一种叫Bayer 格式的RAW数据图像.ISP 对RAW数据图像的处理流程就是我们说的ISP PipeLine.通过PipeLine的处理,我们可以从一副RA ...

  2. Typora数学公式输入指导手册

    Markdown 公式指导手册 公式大全的链接 https://www.zybuluo.com/codeep/note/163962#mjx-eqn-eqsample 目录 Markdown 公式指导 ...

  3. accomplish, accord

    accomplish =achieve; accomplishment=achievement. accomplished: well educated/trained, skilled. skill ...

  4. STM32 CAN用队列缓冲接收的例子

    [1]CAN接收用队列缓冲的例子: 发单帧没有问题,多帧或者连续发两帧就有问题.

  5. spring定时任务执行两次

    最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候, ...

  6. 【Linux】【Services】【VersionControl】git-daemon, httpd, mysql搭建带认证的gitserver

    1. 简介: 比较低端的gitserver,使用centos自带的git-daemon搭建gitserver,使用httpd做上传和下载,利用mod_auth_mysql做认证 2. 环境 # Apa ...

  7. 【Linux】【Services】【VersionControl】Git基础概念及使用

    1. 简介 1.1. 版本控制工具: 本地版本控制系统: 集中化版本控制系统:CVS,SVN 分布式版本控制系统: BitKeeper,Git 1.2. 官方网站: https://git-scm.c ...

  8. Docker(4)-docker常用命令

    帮助命令 docker version # 查看docker的版本信息 docker info # 查看docker的系统信息,包含镜像和容器的数量 docker --help # 帮助命令 dock ...

  9. seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案

    seata服务端和客户端配置(使用nacos进行注册发现,使用mysql进行数据持久化),以及过程中可能会出现的问题与解决方案 说明: 之所以只用nacos进行了注册与发现,因为seata使用naco ...

  10. Python利用ctypes实现C库函数调用

    0X00 ctypes 是强大的,使用它我们就能够调 用动态链接库中函数,同时创建各种复杂的 C 数据类型和底层操作函数.使得python也具备了底层内存操作的能力,再配合python本身强大的表达能 ...