그림 이론 - 생 성 트 리
욕심 에 기초 한 두 가지 알고리즘 을 자주 사용한다.
Prim
Dijksrta 에서 단원 의 가장 짧 은 경 로 를 구 하 는 과정 과 유사 합 니 다.매번 방문 한 결점 에서 나무의 거리 결점 이 가장 작은 결점 을 선택 하고 다른 결점 에서 나무의 결점 까지 의 거 리 를 업데이트 하 며 모든 결점 이 접근 할 때 까지 이 과정 을 반복 한다 (즉, 나무 한 그루 가 생 성 된다).보통 1, 1, 1 을 초기 결산 점 으로 한다.
int dis[N], G[N][N];
bool vis[N];
int Prim() {
int mst = 0;
memset(dis, 0x3f, sizeof(dis)), dis[1] = 0;
for (int k = 1; k <= n; ++k) {
int u = 0;
for (int i = 1; i <= n; ++i)
if (!vis[i] && dis[u] > dis[i]) u = i;
vis[u] = true;
mst += dis[u];
for (int v = 1; v <= n; ++v)
dis[v] = min(dis[v], G[u][v]);
}
return mst;
}
시간 복잡 도 O (n 2) O (n ^ 2) O (n2).
최적화 하 다.
Dijkstra 와 같이 매번 d i s dis dis 의 가장 작은 노드 를 찾 는 과정 은 더미 나 선분 트 리 등 데이터 구조 로 최적화 할 수 있 습 니 다. 여기 서 최적화 코드 를 드 립 니 다.
int dis[N], G[N][N];
bool vis[N];
priority_queue<pair<int, int>,
vector<pair<int, int> >, greater<pair<int, int> > > Q;
int Prim() {
int mst = 0;
memset(dis, 0x3f, sizeof(dis)), dis[1] = 0;
Q.push(make_pair(0, 1));
while (!Q.empty()) {
int u = Q.top().second; Q.pop();
if (vis[u]) continue;
vis[u] = true;
mst += dis[u];
for (int v = 1; v <= n; ++v)
if (dis[v] > G[u][v]) {
dis[v] = G[u][v];
Q.push(make_pair(dis[v], v));
}
}
return mst;
}
시간 복잡 도 O (m log n) O (m \ \ log n) O (mlogn)
Kruskal
Kruskal 알고리즘 은 최소 생 성 트 리 에 끝 을 붙 이 는 과정 으로 볼 수 있 습 니 다.알고리즘 프로 세 스 는 다음 과 같 습 니 다.
최소 생 성 숲
k k 그루 나무 가 있 는 최소 생 성 트 리 숲 에 대해 서도 Kruskal 알고리즘 을 사용 할 수 있 습 니 다.최소 생 성 트 리 의 절차 와 차이 점 은 종료 조건 을 n - k n - k - k 변 으로 바 꾸 는 것 이다.
Kruskal 재 구성 트 리
지금
성질
회로 성
원본 그림 에서 링 을 선택 하면 링 의 가중치 가 가장 큰 변 은 최소 생 성 트 리 에 나타 나 지 않 습 니 다.
절단 성
노드 를 S 와 T 두 부분 으로 나 누고 S 와 T 를 연결 하 는 모든 변 에서 변 권 이 가장 작은 것 은 반드시 최소 생 성 트 리 에 나타 납 니 다.
차 소 생 성 트 리
절단 성질 에서 결론 을 얻 을 수 있 듯 이 차 소 생 성 나무 와 최소 생 성 나 무 는 한 변 의 차이 만 있다.그래서 먼저 최소 생 성 트 리 를 구하 고 모든 비 트 리 변 (u, v) (u, v) (u, v), w (u, v) w (u, v) w (u, v) w (u, v) 로 u u u 에서 v v v v 의 최대 변 을 교체 합 니 다.이 과정 은 나무 위 에서 배로 늘 려 최적화 할 수 있다.총 시간 복잡 도 O (m log n + m log m + mα ( n ) ) O(m \log n + m \log m + m \alpha(n)) O(mlogn+mlogm+mα(n))。
최 단 경로 트 리
네 거 티 브 링 이 없 는 그림 에 대해 하나의 소스 를 선택 하고 이 소스 는 각 점 의 가장 짧 은 경로 로 나 무 를 구성 합 니 다.
Prufer 수열
Prufer 수열 은 뿌리 없 는 나무의 수열 로 n n 개의 결점 이 있 는 나무 에서 전 환 된 Prufer 수열 의 길 이 는 n - 2 n - 2 n - 2 이다.
뿌리 없 는 나무 회전 Prufer 수열
n n 개의 결점 이 있 는 뿌리 없 는 나무 에 대해 서 는 반복 적 으로 삭제 하 는 방식 으로 Prufer 수열 을 구 할 수 있 습 니 다.절 차 는 다음 과 같다.
Prufer 수열 회전 뿌리 없 는 나무
{a n - 2} \ {a {n - 2} \ \} {an - 2} 을 한 나무의 Prufer 수열 로 설정 하고 {G n} \ {G n \} 을 점 집합 으로 설정 하면 Prufer 수열 을 뿌리 없 는 나무 로 변환 하 는 절 차 는 다음 과 같 습 니 다.
Prufer 수열 의 응용
주어진 조건 을 만족 시 키 는 생 성 트 리 가 모두 몇 가지 인지 알 아 보 는 데 사용 할 수 있다.
생 성 트 리 개수
매트릭스 트 리 정리
지금 은...
완전 그림 생 성 트 리
n n 개의 결점 이 있 는 완전한 그림 으로 n - 2 n ^ {n - 2} n - 2 그루 의 생 성 나무 가 있 습 니 다.한 그루 의 생 성 트 리 가 하나의 prufer 수열 에 대응 하기 때문에 prufer 수열 은 n - n - 2 n ^ {n - 2} n - 2 개 이기 때문에 n - n - 2 n ^ {n - 2} n - 2 그루 의 생 성 트 리 가 있 음 을 증명 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.