n명의 사람(0에서 n - 1까지 레이블이 지정됨)이 있고 그 중 한 명의 유명인이 있을 수 있다고 가정합니다. 다른 n - 1명의 사람들이 모두 x를 알고 있지만 x는 그들 중 누구도 알지 못할 때 사람 x가 유명인이라고 말할 수 있습니다. 여기서 우리는 유명인이 누구인지 찾거나 연예인이 없는지 확인해야 합니다.
우리는 'A'라는 사람에게 "안녕, A. B를 아십니까?"라는 한 가지 질문만 할 수 있습니다. A가 B를 알고 있는지 여부에 대한 정보를 얻으려면. 우리는 유명인을 찾기 위해 최소한의 질문을 해야 합니다. 그래프라는 입력으로 리스트 목록이 있는데, i번째 사람이 j번째 사람을 알면 graph[i,j] =1, 그렇지 않으면 0입니다.
따라서 입력이 그래프 =[[1,1,0],[0,1,0],[1,1,1]],
와 같은 경우
0과 2는 모두 그를 알고 있지만 1은 아무도 모르기 때문에 유명인은 1로 레이블이 지정된 사람이므로 출력은 1이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
know() 함수를 정의하면, b,
-
그래프[a, b]가 참일 때 참을 반환
-
주요 방법에서 다음을 수행하십시오 -
-
하나의 스택 정의
-
initialize i :=0의 경우, i
-
i를 st에 삽입
-
-
크기가 st> 1인 동안 −
-
x :=st의 최상위 요소
-
st
에서 요소 삭제 -
y :=st의 최상위 요소
-
st
에서 요소 삭제 -
know(x, y)가 참이면 -
-
y를 st에 삽입
-
-
그렇지 않으면
-
x를 st에 삽입
-
-
-
x :=st의 최상위 요소
-
initialize i :=0의 경우, i
-
i가 x와 같으면 -
-
다음 부분은 무시하고 다음 반복으로 건너뜁니다.
-
-
know(x, i)가 참이거나 know(i, x)가 거짓이면 -
-
반환 -1
-
-
-
x를 반환
예시
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { vector<vector<int<> graph; public: Solution(vector<vector<int<> &graph){ this->graph = graph; } bool knows(int a, int b){ return graph[a][b]; } int findCelebrity(int n) { stack<int< st; for (int i = 0; i < n; i++) { st.push(i); } while (st.size() > 1) { int x = st.top(); st.pop(); int y = st.top(); st.pop(); if (knows(x, y)) { st.push(y); } else { st.push(x); } } int x = st.top(); for (int i = 0; i < n; i++) { if (i == x) continue; if (knows(x, i) || !knows(i, x)) { return -1; } } return x; } }; main(){ vector<vector<int<> v = {{1,1,0},{0,1,0},{1,1,1}}; Solution ob(v); cout << (ob.findCelebrity(3)); }
입력
{{1,1,0},{0,1,0},{1,1,1}} 3
출력
1