E041. Матричная теорема Кирхгофа. Нахождение количества остовных деревьев
Источник: e-maxx.ru/algo, страница PDF 125.
Задан связный неориентированный 图 своей матрицей смежности. Кратные рёбра в 图е допускаются. it is required посчитать количество различных остовных деревьев этого 图а. Приведённая ниже формула принадлежит Кирхгофу (Kirchhoff), который доказал её в 1847 г.
Матричная теорема Кирхгофа
Возьмём матрицу смежности 图а G, заменим каждый element этой матрицы на противоположный, а на диагонале вместо elementа Ai,i поставим степень вершины i (если имеются кратные рёбра, то в степени вершины они учитываются со своей кратностью). Тогда, согласно матричной теореме Кирхгофа, все алгебраические дополнения этой матрицы равны между собой, и равны количеству остовных деревьев этого 图а. На示例, можно удалить последнюю строку и последний столбец этой матрицы, и модуль её определителя будет равен искомому количеству. Определитель матрицы можно find за O (N3) с помощью метода Гаусса или метода Краута. 证明 этой теоремы достаточно сложно и здесь не приводится (см., на示例, Приезжев В.Б. "题目 о димерах и теорема Кирхгофа").
Связь с законами Кирхгофа в электрической цепи
Между матричной теоремой Кирхгофа и законами Кирхгофа для электрической цепи имеется удивительная связь. Можно показать (как следствие из закона Ома и первого закона Кирхгофа), что сопротивление Rij между точками i и j электрической цепи равно:
Rij = |T(i,j)| / |Tj|
где матрица T получена из матрицы A обратных сопротивлений проводников (Aij - обратное number к сопротивлению проводника между точками i и j) преобразованием, описанным в матричной теореме Кирхгофа, а обозначение T(i) обозначает вычёркивание строки и столбца с номером i, а T(i,j) - вычёркивание двух строк и столбцов i и j. Теорема Кирхгофа придаёт этой формуле геометрический смысл.
C# 解法
自动草稿,提交前请检查using System;
using System.Collections.Generic;
using System.Linq;
public static class AlgorithmDraft
{
// Auto-generated C# draft from the original e-maxx C/C++ listing. Review before production use.
Rij = |T(i,j)| / |Tj|
}
C++ 解法
匹配/原始Rij = |T(i,j)| / |Tj|
Java 解法
自动草稿,提交前请检查import java.util.*;
import java.math.*;
public class AlgorithmDraft {
// Auto-generated Java draft from the original e-maxx C/C++ listing. Review before production use.
Rij = |T(i,j)| / |Tj|
}
Материал разбит как 算法ическая 题目: изучить постановку, понять асимптотику и реализовать 算法 на выбранном языке.
Vacancies for this task
活跃职位 with overlapping task tags are 已显示.