Neither shaken nor stirred(DFS理解+vector存图)
题目链接: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存图)相关推荐
- URAL 2013 Neither shaken nor stirred dfs 模拟
题目链接:点击打开链接 题意: 给定n个点的有向图: 下面n行,第一个数字表示点权,后面一个数字m表示有m条边. 起点是1. 对于每个点,输出2个值表示前驱点权1和该点点权2. 1.若有多条路径到达该 ...
- 用html2canvas长按保存h5页面,html2canvas - 微信中长按存图 - 将h5活动结果保存到本地...
现在有很多在微信里流行的h5活动页.这些小h5大部分都是简单的交互然后得出一个abcd早就拟定好的结果,根据你的选项分几种情况,最终得到其中一个作为你测试的答案.比如这个就是最后那张结果图: 当时自己 ...
- 深入理解JVM-内存模型
深入理解JVM-内存模型 1. java 内存模型 简单的说,JMM 定义了一套在多线程读写共享数据时(成员变量.数组)时,对数据的可见性.有序性.和原子性的规则和保障 1.1 原子性 问题提出,两个 ...
- ACM图论之存图方式
<转--剑紫青天> 对于ACM图论方面的题目总是免不了首先要建图存图,使用合适的存图方式不但是AC的必要条件,解题事半功倍. 以下主要分析三种常见的存图方式的优缺点以及代码实现 邻接矩阵 ...
- 利用vector进行图的存储
2018-3-30 图的存储有多种方式,我个人比较常用的就是邻接矩阵(存储方式是用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组存储图中的边或者弧的信息),优点就是构建起来比较方便,而且 ...
- 存图利器——链式前向星
存图的各种数据结构,复杂如下 邻接矩阵 O(1)(查询一条边) O(n)枚举出边 O(N*N)空间复杂度 前向星 O(n)(查询一条边) O(n)枚举出边 O(N ...
- QDUOJ 生化危机 邻接表存图+BFS
生化危机 发布时间: 2015年10月10日 18:05 时间限制: 1000ms 内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...
- 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)
迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...
- 链式前向星存图(有图详解)
链式前向星:既然是链式那么肯定和链表相关,前向星是每次指向都向前 链式前向星存图是以边为中心,并不是以结点为中心,它记录的是边的一些属性,包括边边的id.头节点.尾结点.权值.边的指向! 边的指向是遍 ...
最新文章
- XHTML学习资料(四)—— 图像
- 读书笔记_java设计模式深入研究 第八章 状态模式 State
- GDI文字旋转90度
- Codeforces 766E Mahmoud and a xor trip(树形DP)
- 完全硬件实现的忆阻器卷积神经网络
- 转载--上下标等特殊符号的输入方法
- win10 安装低版本的 .net framework
- 日常---区域赛临近
- bat 下 字符串拆分 类似 split 可以使用 for /f delims
- 指针的意义和linux的内存回收艺术
- MBR磁盘分区见解笔记
- php 查询access数据库操作,php操作access数据库的方法详解
- 数据仓库与数据挖掘复习题目
- SoftICE Window Resizing Commands
- 方面和服务,差别大吗?
- 卡内基梅隆大学计算机专业系,卡内基梅隆大学计算机
- 996下的最后一根稻草
- android sim卡槽,包教包会,十分钟让你搞定与或卡槽
- HashMap源码阅读笔记
- IntelliJ:idea取消启动时的默认工作空间,打开欢迎页面