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>
#include <cstring>
#include <cstring>
#include <vector>
using namespace std;

template <class T>
inline bool rd(T &ret) {
	char c; int sgn;
	if (c = getchar(), c == EOF) return 0;
	while (c != '-' && (c<'0' || c>'9')) c = getchar();
	sgn = (c == '-') ? -1 : 1;
	ret = (c == '-') ? 0 : (c - '0');
	while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0');
	ret *= sgn;
	return 1;
}
template <class T>
inline void pt(T x) {
	if (x <0) {
		putchar('-');
		x = -x;
	}
	if (x>9) pt(x / 10);
	putchar(x % 10 + '0');
}

const int N = 100005;
vector<int> g[N];
int k[N], f[N][2], vis[N];

void dfs(int idx, int fa) {
	if(vis[idx]) {
		if(f[idx][0] != f[fa][1]) {
			f[idx][0] = -1;
			if(!k[idx]) {
				f[idx][1] = -1;
				for(int i = 0; i < (int)g[idx].size(); i ++) {
					int u = g[idx][i];
					dfs(u, idx);
				}
			}
		}
		return ;
	}

	vis[idx] = 1;
	f[idx][0] = f[fa][1];
	f[idx][1] = k[idx] ? k[idx] : f[idx][0];
	for(int i = 0; i < (int)g[idx].size(); i ++) {
		int u = g[idx][i];
		dfs(u, idx);
	}
}
int main() {
	int n, m;
	while (~scanf("%d", &n)) {
		memset(vis, 0, sizeof vis);
//		memset(f, 0, sizeof f);
		for(int i = 1; i <= n; i ++) g[i].clear();

		for(int i = 1; i <= n; i ++) {
			rd(k[i]), rd(m);
			for(int j = 0, x; j < m; j ++) {
				rd(x);
				g[i].push_back(x);
			}
		}

		vis[1] = 1;
		f[1][0] = 0;
		f[1][1] = k[1];
		for(int i = 0; i < (int)g[1].size(); i ++) {
			int u = g[1][i];
			dfs(u, 1);
		}

		for(int i = 1; i <= n; i ++) {
			if(f[i][0] == -1) printf("unknown ");
			else if(f[i][0] == 0) printf("sober ");
			else {
				pt(f[i][0]);
				putchar(' ');
			}

			if(f[i][1] == -1) printf("unknown\n");
			else if(f[i][1] == 0) printf("sober\n");
			else {
				pt(f[i][1]);
				putchar('\n');
			}
		}
	}
	return 0;
}
时间: 2024-10-05 08:13:19

URAL 2013 Neither shaken nor stirred dfs 模拟的相关文章

HDU 5438 Ponds dfs模拟

2015 ACM/ICPC Asia Regional Changchun Online 题意:n个池塘,删掉度数小于2的池塘,输出池塘数为奇数的连通块的池塘容量之和. 思路:两个dfs模拟就行了 1 #include <iostream> 2 #include <cstdio> 3 #include <fstream> 4 #include <algorithm> 5 #include <cmath> 6 #include <deque&

Vijos P1114 FBI树【DFS模拟,二叉树入门】

描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串. FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种.由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下: 1) T的根结点为R,其类型与串S的类型相同: 2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2:由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2. 现在给定一个长度为2^N的“0

hdoj ztr loves lucky numbers 5676 (dfs模拟)

ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 918    Accepted Submission(s): 389 Problem Description ztr loves lucky numbers. Everybody knows that positive integers ar

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输出该点点权,否则输出前驱点权值(若有多条

HDU 1112 The Proper Key DFS+模拟

这题是我做过的好恶心的模拟题之一,WA了两次,要注意很多细节,主要是题意不好懂.这题题意是给你两个字符矩阵,第一个代表钥匙,第二个代表锁.问你,钥匙能否穿过锁,如若不能,输出钥匙插入锁的最大深度. #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #define maxn 1000 #define max

hdu 4740 The Donkey of Gui Zhou(dfs模拟好题)

Problem Description There was no donkey in the province of Gui Zhou, China. A trouble maker shipped one and put it in the forest which could be considered as an N×N grid. The coordinates of the up-left cell is (0,0) , the down-right cell is (N-1,N-1)

POj 3009 Curling 2.0(DFS + 模拟)

题目链接:http://poj.org/problem?id=3009 题意: 题目很复杂,直接抽象化解释了.给你一个w * h的矩形格子,其中有包含一个数字“2”和一个数字“3”,剩下的格子由“0”和“1”组成,目的是计算从“2”走到“3”的最短步数,“1”代表障碍物,“0”代表可以通行.“2”可以往周围四个方向走,如果往某一个方向走,那么停下来的条件是,当这个方向上存在障碍物“1”,且会停在这个障碍物的前一个格子,并会击碎这个障碍物;如果选择的方向上没有障碍物“1”也没有终点“3”,那么就会

蓝桥杯 兰顿蚂蚁 (DFS+模拟)

[题目描述] 历届试题 兰顿蚂蚁 时间限制:1.0s   内存限制:256.0MB 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只"蚂蚁". 蚂蚁的头部朝向为:上下左右其中一方. 蚂蚁的移动规则十分简单: 若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格: 若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格. 规则虽然简单,蚂蚁的行为却十分复杂.刚刚开始时留下的路线都会有接近对称

URAL 1762 Search for a Hiding-Place(数学&#183;模拟)

题意  你在一个n*m个白色正方形格子组成的矩形的某个顶点格子  你沿着45度角的方向走  到了边界就改变方向90度  每次经过一个格子都改变他原来的颜(白或灰)  求你走到另一个顶点格子时矩形中有多少格子是灰色的 这题可以用公式也可以直接模拟  模拟就是一直向右移n-1位 每次超过边界就可以把边界向右移m-1位  用cnt记录超过边界的次数 那么每次都会经过cnt个已经走过的格子 (每个格子最多经过2次)  答案也就减去2*cnt    直到刚好到达边界 #include <bits/stdc