[알고리즘 기 시 뮬 레이 션 문제] 1007. 미니 카.
공유 경제가 발전 함 에 따라 대학 도 시 는 현재 곳곳에서 ofo 노 란 차 를 볼 수 있다. 왼쪽 은 현재 매일 노 란 차 를 타고 기숙사 에서 실험실 로 갈 계획 이다. 대학 도시 의 지 도 를 방향 이 있 는 그림 으로 간략화 할 수 있다 고 가정 하면 그림 에 N 개의 장소 (노드) 가 있 고 0 에서 N - 1 로 번 호 를 매 길 계획 이다. 어떤 장소 사이 에 방향 이 있 는 도로 (방향 이 있 음) 가 존재 한다. 왼쪽 의 기숙사 가 있 는 곳 번 호 는 0 이다.실험실 이 있 는 장소 번 호 는 N - 1 입 니 다. 왼쪽 은 연속 적 인 M 일 계획 노선 을 원 합 니 다. 매일 기숙사 에서 실험실 까지 적어도 이전에 가지 않 았 던 길 (방향 이 있 음) 을 지나 갑 니 다. 왼쪽 은 M 의 최대 치 를 알 고 싶 습 니 다. 당신 은 그 를 도와 줄 수 있 습 니까?
아래 Solution 클래스 의 countPath 함 수 를 실현 하여 상기 기능 을 완성 하 십시오.
매개 변수 G: N * N (2 < = N < = 50) 인접 행렬, 장소 i 에서 장소 j 사이 에 도로 가 있 으 면 G [i] [j] = 1;그렇지 않 으 면 G [i] [j] = 0. G [i] [i] 의 값 은 항상 0 이다.
반환 값: M 의 최대 값 입 니 다. 요 구 를 만족 시 키 는 경로 가 존재 하지 않 으 면 0 으로 돌아 갑 니 다.
class Solution {
public:
int countPaths(vector> G) {
}
};
예 1:
G = {0, 1}, {1, 0}}, 반환 값 은 2 입 니 다. 왜냐하면 첫날: 0 -- > 1, 다음날 0 -- > 1 --> 0 --> 1. 왼쪽 이 다음날 한 바퀴 돌 았 지만 그 는 첫날 지나 지 않 은 가장 자 리 를 걸 었 다. 1 - > 0.
예 2:
G = {0, 1, 1}, {1, 0, 1}, {1, 0, 0}, 반환 값 은 4 입 니 다.
제 1 일: 0 -- > 2
다음날: 0 -- > 2 --> 0 --> 2
제 3 일: 0 -- > 1 --> 2
넷 째 날: 0 -- > 1 --> 0 --> 1 --> 2
예 3:
G = {0, 1, 0}, {1, 0, 0}, {0, 0, 0}, 반환 값 은 0 입 니 다.
[문제 풀이 분석]
n 개의 정점 이 있 는 그림 은 노드 0 에서 노드 n - 1 까지 의 경로 의 최대 수 를 구 합 니 다. 그 중에서 모든 경 로 는 이전에 가지 않 았 던 변 을 포함해 야 합 니 다.
우 리 는 이렇게 고려 할 수 있다. 먼저 노드 0 에서 도착 하지 못 하 는 모든 노드 와 이 노드 와 관련 된 변 을 삭제 할 수 있다. 노드 0 이 도착 하지 못 하기 때문에 우리 의 결과 에 아무런 영향 을 주지 않 는 다.그 다음 에 노드 n - 1 노드 에 도달 하지 못 하 는 모든 노드 와 관련 된 부분 을 삭제 하면 우리 의 결과 에 도 영향 을 주지 않 습 니 다.이 노드 와 변 을 삭제 하여 새로운 그림 을 만 들 었 습 니 다. 크기 는 m 개의 노드, k 개의 변 입 니 다.
마지막 으로 우 리 는 한 노드 를 지나 갈 때마다 반드시 두 개의 변 을 소모 해 야 한다. 즉, 한 개의 입 변, 한 개의 출 변 이지 만 우리 의 출발점 과 종점 변 은 필요 하지 않다. 즉, m - 2 개의 노드 이다.그래서 우 리 는 (k - (m - 2) 경 로 를 얻 을 수 있다.
예:
1. 0.....................................................................................
2. 0.....................................................................................
3, 0.................................................................................
[소스 코드]
class Solution {
public:
int countPaths(vector > G) {
int result = 0;
int m = G.size();
int n = G[0].size();
if (m < 2 || n < 2 || n > 50 || m > 50) return 0;
//
vector vis(m,0);
//
vector to_des(n,0);
queue visited;
//
visited.push(0);
vis[0] = true;
while(!visited.empty()) {
int t = visited.front();
visited.pop();
for (int i = 0; i < m; i++) {
if(G[t][i] == 1 && !vis[i] && t != i) {
vis[i] = true;
visited.push(i);
}
}
}
if (!vis[n-1]) return 0;
//
visited.push(n-1);
to_des[n-1] = true;
while(!visited.empty()) {
int t = visited.front();
visited.pop();
for (int i = 0; i < m; i++) {
if (G[i][t] == 1 && !to_des[i] && i != t) {
to_des[i] = true;
visited.push(i);
}
}
}
//
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (G[i][j] == 1 && vis[i] && vis[j] && to_des[i] && to_des[j]) {
result++;
}
}
}
for (int i = 0; i < n; i++) {
if (to_des[i] && vis[i]) {
result--;
}
}
return result+2;
}
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.