티스토리 뷰

https://www.acmicpc.net/problem/1043

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

 

const input = require('fs')
	.readFileSync('./dev/stdin')
	.toString()
	.trim()
	.split('\n')
	.map((v) => v.split(' ').map(Number));
const [N, M] = input.shift();

const trueman = new Set(input.shift().slice(1));

const party = input.map((v) => v.slice(1));

const edges = Array(N + 1)
	.fill(null)
	.reduce((r, v, i) => {
		r[i] = [];
		return r;
	}, {});

party.forEach((arr) => {
	for (let i = 0; i < arr.length; i++) {
		for (let j = i + 1; j < arr.length; j++) {
			if (!edges[arr[i]].includes(arr[j])) {
				edges[arr[i]].push(arr[j]);
			}

			if (!edges[arr[j]].includes(arr[i])) {
				edges[arr[j]].push(arr[i]);
			}
		}
	}
});

let visited = Array(N + 1).fill(false);

const answer = party
	.map((arr) => {
		const start = arr[0];
		visited = visited.map((v) => false);
		visited[start] = true;
		return knowTrue(start);
	})
	.filter((v) => !v).length;

console.log(answer);

function knowTrue(man) {
	if (trueman.has(man)) return true;
	const friends = edges[man];

	for (let i = 0; i < friends.length; i++) {
		const friend = friends[i];
		if (trueman.has(friend)) return true;
		else {
			if (!visited[friend]) {
				visited[friend] = true;
				if (knowTrue(friend)) return true;
				visited[friend] = false;
			}
		}
	}
	return false;
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함