1003 - Drunk


PDF (English)
Statistics
Forum

Time Limit: 2 second(s)
Memory Limit: 32 MB

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 having b. The names will contain at most10 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

2

2

soda wine

water wine

3

soda wine

water wine

wine water

Output for Sample Input

Case 1: Yes

Case 2: No

::学习一个新算法,总没那么容易,今天又因为一个弄错一个字母找了半天*.*!!

   1: #include <iostream>

   2: #include <cstdio>

   3: #include <algorithm>

   4: #include <cstring>

   5: #include <map>

   6: using namespace std;

   7: const int maxn=11000;

   8: int head[maxn],in[maxn];

   9: bool vis[maxn];

  10: int ant,cas=1,id;

  11:  

  12: map<string,int>a;

  13: struct EDGE{

  14:     int v, next;

  15:     EDGE(){}

  16:     EDGE(int _v, int _next){v = _v, next = _next;}

  17: }e[maxn];

  18: int ecnt;

  19:  

  20: void add(int u, int v){

  21:     e[ecnt] = EDGE(v, head[u]);

  22:     head[u] = ecnt++;

  23: }

  24:  

  25: bool topo(){

  26:     memset(vis, 0, sizeof(vis));

  27:  

  28:     for(int t = 0; t < id; t++){

  29:         int u;

  30:         for(u = 0; u < id; u++)

  31:             if(!vis[u] && !in[u])

  32:                 break;

  33:         if(u >= id)

  34:             return false;

  35:  

  36:         vis[u] = true;

  37:         in[u]--;

  38:         for(int i = head[u]; i != -1; i = e[i].next){

  39:             int v = e[i].v;

  40:             in[v]--;

  41:         }

  42:     }

  43:     return true;

  44: }

  45:  

  46: void solve()

  47: {

  48:     int n;

  49:     ecnt=0,id=0;

  50:     a.clear();

  51:     memset(head,-1,sizeof(head));

  52:     memset(in,0,sizeof(in));

  53:     cin>>n;

  54:  

  55:     while(n--)

  56:     {

  57:         string x,y;

  58:         cin>>x>>y;

  59:  

  60:         if(a.find(x)==a.end()) a[x]=id++;

  61:         if(a.find(y)==a.end()) a[y]=id++;

  62:         int u=a[x],v=a[y];

  63:         add(u,v);

  64:         in[v]++;

  65:     }

  66:     if(topo())

  67:         cout<<"Yes"<<endl;

  68:     else

  69:         cout<<"No"<<endl;

  70: }

  71:  

  72: int main()

  73: {

  74:     ios::sync_with_stdio(false);

  75:     int t, cas = 0;

  76:     cin>>t;

  77:     while(t--){

  78:         cout<<"Case "<< (++cas)<<": ";

  79:         solve();

  80:     }

  81:     return 0;

  82: }

Loj 1003–Drunk(拓扑排序)的更多相关文章

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

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

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

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

  3. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  4. 洛谷 P3975 / loj 2102 [TJOI2015] 弦论 题解【后缀自动机】【拓扑排序】

    后缀自动机入门. 题目描述 为了提高智商,ZJY 开始学习弦论. 这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 \(n\) 的字符串,求出它的第 \ ...

  5. 洛谷 P3244 / loj 2115 [HNOI2015] 落忆枫音 题解【拓扑排序】【组合】【逆元】

    组合计数的一道好题.什么非主流题目 题目背景 (背景冗长请到题目页面查看) 题目描述 不妨假设枫叶上有 \(n​\) 个穴位,穴位的编号为 \(1\sim n​\).有若干条有向的脉络连接着这些穴位. ...

  6. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

  7. LightOJ1003---Drunk(拓扑排序判环)

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

  8. HDU2094产生冠军 (拓扑排序)

    HDU2094产生冠军 Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认 ...

  9. LightOJ - 1003 Drunk

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

随机推荐

  1. OnMeasureItem和OnDrawItem的区别和联系

    我们在做程序设计时界面与功能,那个更加吸引用户的兴趣呢?这是一个很难回答的问题.拥有美丽的外观,软件就成功了一半.界面由控件.工具栏.菜单.窗体等元素组成,对他们进行美化就能得到一个美丽的界面. 目前 ...

  2. [moka同学笔记]yii2.0表单的使用

    1.创建model   /biaodan.php <?php /** * Created by PhpStorm. * User: moka同学 * Date: 2016/08/05 * Tim ...

  3. js generator数据类型

    1. 概述 generator 是ES6引入的新的数据类型, 看上去像一个函数,除了使用return返回, yield可以返回多次. generator 由function* 定义, (注意*号), ...

  4. <s:iterator>各种遍历用法

    struts2<S:iterator>遍历map小结 1.MapAction.java import java.util.ArrayList;   import java.util.Has ...

  5. Linux Shell系列教程之(十三)Shell分支语句case … esac教程

    本文是Linux Shell系列教程的第(十三)篇,更多Linux Shell教程请看:Linux Shell系列教程 分支语句非常实用,基本上高级语言都支持分支语句(python 没有),大多数都使 ...

  6. ComboBox的联动(三层架构)

    需求:根据年级下拉框的变化使得科目下拉框绑定次年级下对应有的值 我们用三层架构的模式来实现 1.我们想和数据库交互,我们首先得来先解决DAL数据库交互层 01.获得年级下拉框的数据 在GradeDAL ...

  7. Java内存泄露的原因

    Java内存泄露的原因 1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector ...

  8. Jquery easyui Tree的简单使用

    Jquery easyui Tree的简单使用 Jquery easyui 是jQuery EasyUI是一组基于jQuery的UI插件集合,而jQuery EasyUI的目标就是帮助web开发者更轻 ...

  9. 桥牌笔记:Skill Level 4 D8

    西拿黑桃K.A后,转攻小方块. 看来只有一个小红桃失张了.飞方块没有必要冒险.但将牌分布4-0时会有点麻烦.

  10. unity学习网站汇总

    由于最近要学习unity3d 开发,把自己找来的资料汇总下 unity3D官方学习资源:https://www.assetstore.unity3d.com/ unity3D API查询网站:http ...