题目链接:http://acm.timus.ru/problem.aspx?space=1&num=2013

题目理解:

给定n个点的有向图:

下面n行,第一个数字表示点权,后面一个数字m表示有m条边。

起点是1.

对于每个点,输出2个值表示前驱点权1和该点点权2。

1、就是若有多条路径且全为“同一个值”输出“同一个值”,否则输出unknown;

  若有一条路径若前驱节点的权值>0,输出前驱结点的权值,否则输出sober;

2、否则若该点点权>0输出该点点权,否则输出前驱点权值(若有多条路径且全为“同一个值”输出“同一个值”,否则输出unknown;

  若有一条路径若前驱节点的权值>0,输出前驱结点的权值,否则输出sober)

AC代码+详解

  1 /* */
  2 # include <iostream>
  3 # include <stdio.h>
  4 # include <string.h>
  5 # include <algorithm>
  6 # include <bitset>
  7 # include <ctime>
  8 # include <cmath>
  9 # include <list>
 10 # include <cctype>
 11 # include <cassert>
 12 # include <iomanip>
 13 # include <deque>
 14 # include <queue>
 15 # include <stack>
 16 # include <set>
 17 # include <map>
 18 # include <vector>
 19 using namespace std;
 20
 21 const int inf=0x3f3f3f3f;
 22 const int maxn=2e5+50;
 23 int a[maxn];
 24 int zt[maxn];
 25 vector<int>ve[maxn];
 26
 27 void dfs(int x, int y)///x此结点,y前驱结点的权值
 28 {
 29     if( zt[x]==-2 )///有两个前驱,(既然已经判断出有两个前驱,且此路之前来过,就没必要再往下遍历了)
 30         return ;
 31
 32
 33     if( !zt[x] )///还没有访问过
 34         zt[x] = y;///记录其前驱节点的权值
 35     else///已经访问过之后又来访问说明有两个前驱结点了,标记一下
 36         zt[x] = -2;
 37
 38
 39     if( a[x] )///此结点的权值不为0
 40         y=a[x];
 41
 42
 43     for( auto it:ve[x] )
 44     {
 45         if( zt[it]!=y )///之前的前驱结点的值不为现在前驱结点的值,
 46             ///若zt[it]原来为0,说明没有遍历过
 47             ///若zt[it]原来为-1,或者是一个正整数
 48             ///但之前前驱结点的值与此时前驱节点的值不一样
 49             ///那么就再进行一次遍历
 50             ///至于具体是什么情况,for有前面的判断决定
 51         {
 52             dfs(it, y);
 53         }
 54     }
 55
 56 }
 57
 58 int main()
 59 {
 60     memset(zt, 0, sizeof(zt));
 61     int n;
 62     cin>>n;
 63     for(int i=1; i<=n; i++ )
 64     {
 65         cin>>a[i];
 66         int x;
 67         cin>>x;
 68         for(int j=1; j<=x; j++ )
 69         {
 70             int y;
 71             cin>>y;
 72             ve[i].push_back(y);
 73         }
 74     }
 75     dfs(1, -1);
 76
 77     for(int i=1; i<=n; i++ )
 78     {
 79         if( zt[i]==-1 )
 80             cout<<"sober ";
 81
 82         else if( zt[i]==-2 )
 83             cout<<"unknown ";
 84
 85         else
 86             cout<<zt[i]<<' ';
 87
 88         if( a[i]>0 )
 89             cout<<a[i]<<endl;
 90
 91         else
 92         {
 93             if( zt[i]==-1 )
 94                 cout<<"sober"<<endl;
 95
 96             else if( zt[i]==-2 )
 97                 cout<<"unknown"<<endl;
 98
 99             else
100                 cout<<zt[i]<<endl;
101         }
102     }
103     return 0;
104 }

View Code

转载于:https://www.cnblogs.com/wsy107316/p/11317958.html

Neither shaken nor stirred(DFS理解+vector存图)相关推荐

  1. URAL 2013 Neither shaken nor stirred dfs 模拟

    题目链接:点击打开链接 题意: 给定n个点的有向图: 下面n行,第一个数字表示点权,后面一个数字m表示有m条边. 起点是1. 对于每个点,输出2个值表示前驱点权1和该点点权2. 1.若有多条路径到达该 ...

  2. 用html2canvas长按保存h5页面,html2canvas - 微信中长按存图 - 将h5活动结果保存到本地...

    现在有很多在微信里流行的h5活动页.这些小h5大部分都是简单的交互然后得出一个abcd早就拟定好的结果,根据你的选项分几种情况,最终得到其中一个作为你测试的答案.比如这个就是最后那张结果图: 当时自己 ...

  3. 深入理解JVM-内存模型

    深入理解JVM-内存模型 1. java 内存模型 简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量.数组)时,对数据的可见性.有序性.和原子性的规则和保障 1.1 原子性 问题提出,两个 ...

  4. ACM图论之存图方式

    <转--剑紫青天> 对于ACM图论方面的题目总是免不了首先要建图存图,使用合适的存图方式不但是AC的必要条件,解题事半功倍. 以下主要分析三种常见的存图方式的优缺点以及代码实现 邻接矩阵 ...

  5. 利用vector进行图的存储

    2018-3-30 图的存储有多种方式,我个人比较常用的就是邻接矩阵(存储方式是用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组存储图中的边或者弧的信息),优点就是构建起来比较方便,而且 ...

  6. 存图利器——链式前向星

    存图的各种数据结构,复杂如下 邻接矩阵    O(1)(查询一条边)      O(n)枚举出边    O(N*N)空间复杂度 前向星 O(n)(查询一条边)      O(n)枚举出边    O(N ...

  7. QDUOJ 生化危机 邻接表存图+BFS

    生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...

  8. 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)

    迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...

  9. 链式前向星存图(有图详解)

    链式前向星:既然是链式那么肯定和链表相关,前向星是每次指向都向前 链式前向星存图是以边为中心,并不是以结点为中心,它记录的是边的一些属性,包括边边的id.头节点.尾结点.权值.边的指向! 边的指向是遍 ...

最新文章

  1. XHTML学习资料(四)—— 图像
  2. 读书笔记_java设计模式深入研究 第八章 状态模式 State
  3. GDI文字旋转90度
  4. Codeforces 766E Mahmoud and a xor trip(树形DP)
  5. 完全硬件实现的忆阻器卷积神经网络
  6. 转载--上下标等特殊符号的输入方法
  7. win10 安装低版本的 .net framework
  8. 日常---区域赛临近
  9. bat 下 字符串拆分 类似 split 可以使用 for /f delims
  10. 指针的意义和linux的内存回收艺术
  11. MBR磁盘分区见解笔记
  12. php 查询access数据库操作,php操作access数据库的方法详解
  13. 数据仓库与数据挖掘复习题目
  14. SoftICE Window Resizing Commands
  15. 方面和服务,差别大吗?
  16. 卡内基梅隆大学计算机专业系,卡内基梅隆大学计算机
  17. 996下的最后一根稻草
  18. android sim卡槽,包教包会,十分钟让你搞定与或卡槽
  19. HashMap源码阅读笔记
  20. IntelliJ:idea取消启动时的默认工作空间,打开欢迎页面

热门文章

  1. js实现表格的增添和删除操作
  2. T3054 高精度练习-文件操作 codevs
  3. 那些著名网站的90年代(转)
  4. 红帽8搭建httpd
  5. c语言中a的作用是什么意思,在c语言中* a是什么意思
  6. 瑞幸点燃导火索,兄弟公司神州租车迎大变局
  7. 深圳大数据培训:Transformation算子演示
  8. 50%的转正率——瑞晟
  9. 让Python使用Bing翻译API V2
  10. 10、(加强版)本金10000元存入银行,年利率是千分之三。每过一年,将本金和利息相加作为新的本金。计算五年后,获得的本金是多少?