М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
nastyaborisova13
nastyaborisova13
23.01.2021 00:30 •  Информатика

Какое максимальное количество ребер у неориентированного графа с n вершин и k компонент связности. напомню, что для полного неориентированного графа это n * (n - 1) / 2

👇
Ответ:
natalijamatijch
natalijamatijch
23.01.2021
Каждая из компонент связности должна быть кликой (иначе говоря, каждые две вершины в одной компоненте связности должны быть связаны ребром). Если в i-ой компоненте связности n_i вершин, то общее число рёбер будет суммой по всем компонентам связности:

\displaystyle \sum_{i=1}^K\frac{n_i(n_i-1)}2=\frac12\sum_{i=1}^K n_i^2-\frac12\sum_{i=1}^Kn_i=\frac12\sum_{i=1}^K n_i^2-\frac N2

Требуется найти максимум этого выражения (т.е. на самом деле - максимум суммы квадратов) при условии, что сумма всех ni равна N и ni - натуральные числа.

Если K = 1, то всё очевидно - ответ N(N - 1)/2. Пусть K > 1.

Предположим, n1 <= n2 <= ... <= nK - набор чисел, для которых достигается максимум, и n1 > 1. Уменьшим число вершин в первой компоненте связности до 1, а оставшиеся вершины "перекинем" в K-ую компоненту связности. Вычислим, как изменится сумма квадратов:
\Delta(\sum n_i^2)=(1^2+(n_K+n_1-1)^2)-(n_1^2+n_K^2)=2(n_1-1)(n_K-1)
Поскольку по предположению n1 > 1 (тогда и nK > 1), то сумма квадратов увеличится, что противоречит предположению о том, что на выбранном изначально наборе достигается максимум. Значит, максимум достигается, если наименьшая по размеру компонента связности - изолированная вершина. Выкинем эту компоненту связности, останутся K - 1 компонента связности и N - 1 вершина. Будем продолжать так делать, пока не останется одна вершина, тогда получится, что во всех компонентах связности кроме последней должно быть по одной вершине.

Итак, должно выполняться
n_1=n_2=\cdots=n_{K-1}=1;\qquad n_K=N-K+1

Подставив в исходную формулу, получаем
\displaystyle\frac{(N-K)(N-K+1)}{2}

Это и есть ответ.
4,7(55 оценок)
Открыть все ответы
Ответ:
Matveystori
Matveystori
23.01.2021

#include<bits/stdc++.h>

using namespace std;

int main(){

int n,m,k;

cin>>n>>m>>k;

if(k==m*n-1){

   cout<<"IMPOSSIBLE";

   return 0;

}

char a[n][m];

for(int i = 0; i<n; i++){

   for(int j = 0; j<m; j++){

       if(k>0){

           a[i][j]='U';

           k--;

           cout<<'U';

       } else if((a[i-1][j]=='U' || i==0) && i==n-1 && j!=m-1){

           cout<<'R';

       } else if((a[i-1][j]=='U' || i==0) && i==n-1 && j==m-1){

           a[i][j] = 'L';

           cout<<'L';

       } else if(i==n-1 && a[i-1][j]!='U') {

           cout<<'U';

       } else {

           cout<<'D';

       }

   }

   cout<<endl;

}

return 0;

}

Объяснение

код написан на языке с++;

есть 5 случаев которые приведены в картинках ниже + случай когда n*m-1=k выводит Impossible


5. квест новый квест, в котором участники должны выбраться с территории проведения, представляет соб
5. квест новый квест, в котором участники должны выбраться с территории проведения, представляет соб
5. квест новый квест, в котором участники должны выбраться с территории проведения, представляет соб
5. квест новый квест, в котором участники должны выбраться с территории проведения, представляет соб
4,4(42 оценок)
Ответ:
7547854
7547854
23.01.2021

Очевидно, решения нет, если нужно выпустить ровно K = NM - 1 человека: он должен перейти в какую-то комнату, но из всех комнат, кроме его, есть путь наружу.

При всех остальных K можно, например, поступить так:

- отсчитать сверху и слева направо K комнат, в них открыть дверь вверх

- в оставшихся комнатах, не находящихся в нижнем ряду, открыть путь вниз

- в оставшихся комнатах нижнего ряда, кроме правого нижнего угла, открыть дверь вправо

- в правом нижнем углу, если там ещё не открыта дверь, открыть дверь влево

В итоге K человек уйдут с территории через верх, а остальные будут бесконечно ходить между двумя комнатами в правом нижнем углу.

Код (python 3):

N, M, K = map(int, input().split())

if K == N * M - 1:

   print("IMPOSSIBLE")

elif K == N * M:

   for _ in range(N):

       print("U" * M)

else:

   for _ in range(K // M):

       print("U" * M)

   if K // M < N - 1:

       print("U" * (K % M) + "D" * (M - K % M))

       for __ in range(N - 1 - K // M):

           print("D" * M)

       print("R" * (M - 1) + "L")

   else:

       print("U" * (K % M) + "R" * (M - K % M - 1) + "L")

4,4(37 оценок)
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ