Loj 1003–Drunk(拓扑排序)
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(拓扑排序)的更多相关文章
- Lightoj 1003 - Drunk(拓扑排序)
One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...
- Lightoj 1003 - Drunk(拓扑排序判断是否有环 Map离散化)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1003 题意是有m个关系格式是a b:表示想要和b必须喝a,问一个人是否喝醉就看一个人是 ...
- [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)
[LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...
- 洛谷 P3975 / loj 2102 [TJOI2015] 弦论 题解【后缀自动机】【拓扑排序】
后缀自动机入门. 题目描述 为了提高智商,ZJY 开始学习弦论. 这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为 \(n\) 的字符串,求出它的第 \ ...
- 洛谷 P3244 / loj 2115 [HNOI2015] 落忆枫音 题解【拓扑排序】【组合】【逆元】
组合计数的一道好题.什么非主流题目 题目背景 (背景冗长请到题目页面查看) 题目描述 不妨假设枫叶上有 \(n\) 个穴位,穴位的编号为 \(1\sim n\).有若干条有向的脉络连接着这些穴位. ...
- 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...
- LightOJ1003---Drunk(拓扑排序判环)
One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...
- HDU2094产生冠军 (拓扑排序)
HDU2094产生冠军 Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认 ...
- LightOJ - 1003 Drunk
One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...
随机推荐
- Ubuntu系统操作快捷键
Ubuntu操作基本快捷键* 打开主菜单 = Alt + F1* 运行 = Alt + F2* 显示桌面 = Ctrl + Alt + d* 最小化当前窗口 = Alt + F9* 最大化当前窗口 = ...
- 优化win2d实现的萤火虫粒子效果
前几天我发了个技术博客,告诉大家怎样用Win2D 画萤火虫动画 . 那种绘制萤火虫的方式虽然画质高,但是性能不好,萤火虫数量超过50就可以感受到帧数下降. 我今天想到了一种牺牲画质提升性能的绘制方式, ...
- js generator数据类型
1. 概述 generator 是ES6引入的新的数据类型, 看上去像一个函数,除了使用return返回, yield可以返回多次. generator 由function* 定义, (注意*号), ...
- linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解
最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...
- android:ellipsize实现跑马灯效果总结(转)
最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说 ...
- 每日微软面试题——day 6(打印所有对称子串)
每日微软面试题——day 6(打印所有对称子串) 分类: 2.数据结构与算法2011-08-14 14:27 9595人阅读 评论(15) 收藏 举报 面试微软string测试systemdistan ...
- Javascript一些小细节
1.判断class存在 $(obj).hasClass('BTCheck_ON') $obj.attr('class')=="BTCheck_ON" 有时我们判断样式存在会写成第二 ...
- Oracle LPAD/RPAD函数在处理中文时的注意事项
首先看下Oracle官方对函数的定义: The RPAD function returns an expression, right-padded to a specified length with ...
- android 圆角按钮和按钮颜色
1. android 设置圆角按钮后,按下按钮后,还能改变按钮的颜色 <?xml version="1.0" encoding="UTF-8"?> ...
- GridView总结一:GridView自带分页及与DropDownList结合使用
GridView自带的分页功能实现: 要实现GrdView分页的功能 操作如下: 1.更改GrdView控件的AllowPaging属性为true. 2.更改GrdView控件的PageSize属性为 ...