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)

  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 }

原文地址:https://www.cnblogs.com/wsy107316/p/11317576.html

时间: 2024-10-10 17:13:01

Neither shaken nor stirred(DFS理解+vector存图)的相关文章

POJ 1655.Balancing Act-树的重心(DFS) 模板(vector存图)

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17497   Accepted: 7398 Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or m

B - Cow Marathon DFS+vector存图

After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has committed to create a bovine marathon for his cows to run. The marathon route will include a pair of farms and a path comprised of a se

URAL 2013 Neither shaken nor stirred dfs 模拟

题目链接:点击打开链接 题意: 给定n个点的有向图: 下面n行,第一个数字表示点权,后面一个数字m表示有m条边. 起点是1. 对于每个点,输出2个值表示前驱点权1和该点点权2. 1.若有多条路径到达该点且前驱的点权存在>0则输出unknown,否则输出前驱的点权(就是若有多条路径且全为0输出0,否则若只有一条路径则输出前驱点权,否则输出unknown) 2.若1输出的是0,则输出该点点权,否则若该点点权>0输出该点点权,否则输出前驱点权. ==略繁琐 #include <cstdio&g

从存图到最短路算法的图论总结

INTRODUCTION: 图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式.很多问题都可以转化为图论问题,然后用图论的基本算法加以解决.--百度百科 对于OI而言,图是指由若干给定的点及若干条连接两点的线(边)所构成的图形 借助图论知识,我们往往可以将一些复杂的问题转化到基础的图论算法上,进而使用已有算法解决全新问题 那么想如果想要运用图论,首先要从存图开始 前排感谢教我图论的周润喵老师,syc学长,就序老师 可是我还是没学会 一,存图 对于一个图而

Safe Path(bfs+一维数组存图)

题目链接:http://codeforces.com/gym/101755/problem/H 题目分析:先bfs一遍怪兽可以到达的点,再bfs人可以走的地方看可不可以到达终点: 很显然读到  2<=n*m<=200000 时,就不可以用二维数组存图了,不过据说因为数据比较水,可以用vector存图: vector存图AC代码: 1 /* */ 2 # include <iostream> 3 # include <stdio.h> 4 # include <st

最短路 spfa 算法 &amp;&amp; 链式前向星存图

推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/details/54379641 spfa  自行百度 说的很详细 spfa 有很多实现的方法  dfs  队列  栈  都可以 时间复杂度也不稳定 不过一般情况下要比bellman快得多 #include <stdio.h> #include <math.h> #include <st

基础图论--存图

图论蛮好玩的呢  比起数论真是有趣多了 有空整理一下下 首先,图是个什么鬼东东呢 graph, 一堆点集,一堆边集,可以把各种事物抽象成点,事物之间的联系用边来表示,边上还可有权值,表示距离费用等 e.g. 把各个城市抽象成点,城市之间可以由高铁直达的称作有联系(边), 边上还可附加权值,俩城市间距离等 至于一些基本概念, 有向无向,是否成环,入度出度等就不多讲啦 基本概念理解就好 现在看看存图,看不同情况来选适合的存图方式 邻接矩阵---二维矩阵 a[ n ][ m ], 可用a[i][j]=

Count on a tree SPOJ 主席树+LCA(树链剖分实现)(两种存图方式)

Count on a tree SPOJ 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)[GO!] 题意 是说有棵树,每个节点上都有一个值,然后让你求从一个节点到另一个节点的最短路上第k小的值是多少. 解题思路 看到这个题一想以为是树链剖分+主席树,后来写着写着发现不对,因为树链剖分我们分成了一小段一小段,这些小段不能合并起来求第k小,所以这个想法不对.奈何不会做,查了查题解,需要用LCA(最近公共祖先),然后根据主席树具有区间加减的性质,我们

NYOJ 20 吝啬的国度 【BFS+链式前向星建图,Vector建图】

吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路). 输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000