데이터 구조 DAG 다 원 최 단 (장) 로 총화
머리말
먼저 DAG 가 무엇 인지 알 아야 한다. 고리 가 없 는 그림 이 있 으 면 토폴로지 정렬, 관건 적 인 경 로 를 구 할 수 있 고 공사 계획 에 큰 도움 이 된다.만약 에 어떤 문제 가 DAG 를 전제 로 하 는 것 을 발견 하면 DAG 의 무 권 성에 따라 가장 좋 은 서브 구 조 를 가지 고 있다 는 것 을 증명 할 수 있 고 \ (O (n + e) \) 의 복잡 도 에서 DAG 의 다 원 화 된 최 단 (최 장) 길 을 구 할 수 있다.그래서 정점 간 에 최 단 로 를 계산 할 때 우 리 는 일반 그림 의 Floyd 알고리즘 을 사용 할 수 있 습 니 다. 그 원 리 는 패 킷 을 전달 하 는 원 리 를 이용 하여 매번 \ (E ^ k = E ^ {k + 1} \), 경로 길이 + 1 에 해당 합 니 다. 동적 계획 을 바탕 으로 합 니 다. \ (dp [i] [j] = max (dp [i] [k] + dp [k] [j], dp [i] [j] \), 복잡 도 \ (O (n ^ 3) \).DAG 의 성질 을 이용 하여 우 리 는 \ (O (ne) \) 에서 완성 할 수 있 고 원리 도 동적 계획 에 기초 한 것 이다.
DAG 최 단 길
묘사 하 다.
문 제 를 말 하면 여기 dp 상태 dist 는 두 가지 이해 방식 이 있 습 니 다.
이루어지다
void shortTest() {
Topsort(edge, ts); // ts
for (int i = 0; i < ts.size(); i++) { //
int cur = ts[i]; //
for (int j = 0; j < edge[cur].size(); j++) {
edge& v = edge[cur][j]; //
if (c[v.to] > c[cur] + v.w) { //
c[v.to] = c[cur] + v.w; //update
pre[v.to] = cur; //
}
}
}
}
DAG 최 장 로
묘사 하 다.
DAG 최 단 로 와 유사 합 니 다. 업데이트 할 때마다 조건 을 바 꾸 면 됩 니 다.
이루어지다
void shortTest() {
Topsort(edge, ts); // ts
for (int i = 0; i < ts.size(); i++) { //
int cur = ts[i]; //
for (int j = 0; j < edge[cur].size(); j++) {
edge& v = edge[cur][j]; //
if (c[v.to] < c[cur] + v.w) { // :
c[v.to] = c[cur] + v.w; //update
pre[v.to] = cur; //
}
}
}
}
DAG 의 모든 정점 대 사이 의 최 단 로
묘사 하 다.
마찬가지 로 DAG 의 그림 에서 가장 좋 은 서브 구조 에 따라 동적 계획 을 하 는데 핵심 적 인 사 고 는 \ (dfs \) 를 이용 하여 모든 것 을 구 하 는 것 이다.
인접 점 의 최 단 로 는 결 과 를 행렬 에 저장 합 니 다.
계산 이 끝나 고 가장 좋 으 며 많은 최 단 로 알고리즘 에 따라 느슨 해 질 수 있 으 며 느슨 해 지 는 것 은 삼각형 을 이용 하 는 것 이다.
등식 은 바로 bellman 방정식 을 나머지 이웃 접점 으로 업데이트 하 는 가장 짧 은 길 입 니 다. 물론 연결 되 지 않 으 면 안 됩 니 다.
업데이트 가 가능 합 니 다.구체 적 인 과정 은 다음 과 같다.
void init() {
memset(dist, inf, sizeof(dist)); //
memset(suf, -1, sizeof(suf)); //
}
void dfs(int cur) {
dist[cur][cur] = 0; // cost,
for (int i = 0; i < edge[cur].size(); i++) {
edge& v = edge[cur][i];
if (dist[cur][v] < v.w) { //
dist[cur][v] = v.w;
suf[cur][v] = v.to; //
}
if (dist[s][v] == inf) dfs(v.to); //
for (int j = 1; j <= n; j++) //
if (dist[v.to][j] < inf) //
if (dist[cur][j] > dist[v.to][j] + v.w) {
dist[cur][j] > dist[v.to][j] + v.w;
suf[cur][j] = v.to; //
}
}
}
void AllshortPaths() {
init();
for (int i = 1; i <= n; i++)
if (dist[i][i] == inf)
dfs(i);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.