Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

그래프의 꼭짓점을 찾는 C++ 프로그램

<시간/>

n개의 꼭짓점이 있는 그래프가 있다고 가정합니다. 꼭짓점에는 1에서 n까지 번호가 지정되며 배열 '가장자리'에 지정된 가장자리로 연결됩니다. 각 정점은 배열 '값'에 지정된 1에서 n 사이의 숫자 내에서 'x' 값을 갖습니다. 이제 그래프에서 슈퍼 정점을 찾아야 합니다. 꼭짓점 i는 꼭짓점 1에서 i까지의 최단 경로에 i번째 꼭짓점과 'x' 값이 같은 꼭짓점이 없을 때마다 '수퍼 꼭짓점'이라고 합니다. 이 기준을 만족하는 모든 정점을 출력합니다.

그래프의 꼭짓점을 찾는 C++ 프로그램

따라서 입력이 n =5와 같으면 값 ={1, 2, 2, 1, 3}, 가장자리 ={{1, 2}, {2, 3}, {2, 3}, {2, 4 }, {4, 5}}, 출력은 1 3 4 5가 됩니다.

꼭짓점 2를 제외한 모든 꼭짓점이 기준을 만족합니다. 따라서 정점 2는 제외됩니다.

단계

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

크기가 100005인 배열 vertexVal, frq 및 chk를 정의합니다. 크기가 200005인 배열 vcti를 정의합니다. dfs() 함수를 정의합니다. frq[vertexVal[j]]가 0과 같으면 j, k가 필요합니다. , 그러면:chk[j] :=1(frq[vertexVal[j]]를 1만큼 증가) vcti[j]의 각 값 a에 대해 다음을 수행합니다. a가 k와 같지 않으면 dfs(a, j) (frq[vertexVal[j]]를 1만큼 감소) i:=0 초기화를 위해, i  

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include 네임스페이스 std;int n;int vertexVal[100005], frq[100005], chk[100005];vector vcti[200005];void dfs(int j, int k){ if (frq[vertexVal[j]] ==0) chk[j] =1; frq[vertexVal[j]]++; for (auto a :vcti[j]) { if (a !=k) dfs(a, j); } frq[vertexVal[j]]--;}void solve(int values[], vector> edge){ for (int i =0; i > 가장자리 ={{1, 2}, {2, 3}, {2, 3}, {2, 4}, {4, 5}}; 해결(값, 모서리); 반환 0;}

입력

5, {1, 2, 2, 1, 3}, {{1, 2}, {2, 3}, {2, 3}, {2, 4}, {4, 5}} 

출력

1345