题目链接:http://lightoj.com/volume_showproblem.php?problem=1003

题意是有m个关系格式是a b;表示想要和b必须喝a,问一个人是否喝醉就看一个人是否能把所有种类的饮料喝完,能输出Yes,不能输出No;

其实就是有向图判断是否存在环,可以用拓扑排序来求

拓扑排序:每次找到一个入度为0的点加入队列,删除与之相连的边,循环操作,得到的序列就是拓扑序(前面的必须出现在后面的前面);

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<stack>
#include<map>
using namespace std;
#define N 21010
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a)) vector<vector<int> >G;///有向图;
int cnt, du[N];///cnt表示共有多少种饮料,du[i]表示map离散化后的饮料编号i的入度; int topo()
{
queue<int>Q; for(int i=; i<=cnt; i++)
{
if(du[i] == )
Q.push(i);
}
int num = ;///已得到的拓扑序序列中的个数;
while(Q.size())
{
num++;
int u = Q.front(); Q.pop();
int len = G[u].size(), v;
for(int i=; i<len; i++)
{
v = G[u][i];
du[v] --;
if(du[v] == )
Q.push(v);
}
}
if(num == cnt)///如果得到的和总的相等则不存在环,否则存在;
return ;
return ;
} int main()
{
int T, n, t = ; scanf("%d", &T); while(T--)
{
scanf("%d", &n); G.clear();
G.resize(n*+); cnt = ;
met(du, ); char s1[], s2[]; map<string, int> M;
M.clear(); for(int i=; i<=n; i++)
{
scanf("%s %s", s1, s2); if(M[s1] == ) M[s1] = ++cnt;
if(M[s2] == ) M[s2] = ++cnt; G[M[s1]].push_back(M[s2]); du[M[s2]] ++;
} if( topo() )
printf("Case %d: Yes\n", t++);
else
printf("Case %d: No\n", t++);
}
return ;
}

Lightoj 1003 - Drunk(拓扑排序判断是否有环 Map离散化)的更多相关文章

  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. hdoj 4324 Triangle LOVE【拓扑排序判断是否存在环】

    Triangle LOVE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  3. UVA-1572 Self-Assembly(拓扑排序判断有向环)

    题目: 给出几种正方形,每种正方形有无穷多个.在连接的时候正方形可以旋转.翻转. 正方形的每条边上都有一个大写英文字母加‘+’或‘-’.00,当字母相同符号不同时,这两条边可以相连接,00不能和任何边 ...

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

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

  5. hihocoder 1174 [BFS /拓扑排序判断是否有环]

    hihocoder 1174 [算法]: 计算每一个点的入度值deg[i],这一步需要扫描所有点和边,复杂度O(N+M). 把入度为0的点加入队列Q中,当然有可能存在多个入度为0的点,同时它们之间也不 ...

  6. 拓扑排序 判断给定图是否存在合法拓扑序列 自家oj1393

    //拓扑排序判断是否有环 #include<cstdio> #include<algorithm> #include<string.h> #include<m ...

  7. LightOJ - 1003 Drunk

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

  8. HDU 3342 Legal or Not(拓扑排序判断成环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 题目大意:n个点,m条有向边,让你判断是否有环. 解题思路:裸题,用dfs版的拓扑排序直接套用即 ...

  9. POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28399   Accepted: 9684 De ...

随机推荐

  1. 【转载】PADS Layout将导入DXF,并转换成板框步骤

    1.在PADS Layout中选择 Import... 2.选择DXF文件(一般由结构工程师给出),直接点OK即可. 3.导入后,板框图一角视图如下.右键选择 Select Shapes,然后双击外框 ...

  2. BIEE物理业务层编辑之后发布路径

    在BI 业务逻辑层编辑之后,需要发布,地址是http://pc201411260149:7001/em/, IP/em 在business intelligence 页面,点击部署,然后选择文件发布

  3. 3th January 2014

    I owe my girl so much, i want to pay her, i know this is impossible,but I still try hard.

  4. Java精选笔记_面向对象(慨念、类和对象)

    面向对象概念 在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象. 相对于面向过程而言.是一种思想,强调的是功能的对象. 面向对象的本质:以类的方式组织代码, ...

  5. MVC3--View层

    Razor二义性: 1,当view层中出现   邮件格式时候比如   anbylau2130@qq.com 这种情况Razor将会出现多义性 可以使用@@来转义为一个@字符, 如:<p>y ...

  6. Swift - UITableView的用法

    因为倾向于纯代码编码,所以不太喜欢可视化编程,不过也略有研究,所以项目里面的所有界面效果,全部都是纯代码编写! 终于到了重中之重的tableview的学习了,自我学习ios编程以来,工作中用得最多的就 ...

  7. Android 程序员必须知道的 53 个知识点

    1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式 ...

  8. iOS - 布局重绘机制相关方法的研究

    iOS View布局重绘机制相关方法 布局 - (void)layoutSubviews - (void)layoutIfNeeded- (void)setNeedsLayout —————————— ...

  9. Oracle12cWindows安装、介绍及简单使用(图文)

    1.下载 地址为:http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html 含企业版和 ...

  10. Django restframwork

    REST介绍 全称Representational State Transfer,即表现层状态转换,如果一个架构符合REST原则,我们就称他为Restfull架构,其主要包括如下方面: 资源Resou ...