Информатика и математика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Информатика и математика » Байт решений задач с acm.pku » acm.pku 1236 Network of Schools


acm.pku 1236 Network of Schools

Сообщений 1 страница 6 из 6

1

http://acm.pku.edu.cn/JudgeOnline/problem?id=1236

Задача Межшкольная сеть

   Некоторые школы связаны компьютерной сетью. Между школами заключены соглашения: каждая школа имеет список школ-получателей, которым она рассылает программное обеспечение всякий раз, получив новое программное обеспечение (извне сети или из другой школы). При этом, если школа В есть в списке получателей школы А, то школа А может и не быть в списке получателей школы В.

   Требуется написать программу, определяющую минимальное количество школ, которым надо передать по экземпляру нового программного обеспечения, чтобы распространить его по всем школам сети в соотвествии с соглашением (подзадача А).

   Кроме того, надо обеспечить возможность рассылки нового программного обеспечения из любой школы по всем остальным школам. Для этого можно расширять списки получателей некоторых школ, добавляя в них новые школы. Требуется найти минимальное суммарное количество расширений списков, при которых программное обеспечение из любой школы достигло бы всех остальных школ (подзадача В). Одно расширение означает добавление одной новой школы-получателя  в список получателей одной из школ.

   Технические условия.  Входные данные: Первая строка содержит целое число N - количество школ в сети (2 <= N <= 100). Школы нумеруются первыми N положительными целыми числами. Каждая из следующих N строк задает список получателей. Строка i+1 содержит номера получателей i-й школы. Каждый такой список заканчивается нулем. Пустой список содержит только нуль.

   Выходные данные: Ваша программа должна вывести две строки. Первая строка должна содержать одно положительное целое число - решение подзадачи А. Вторая строка должна содержать решение подзадачи В.

   Пример входных данных:

5
2 4 3 0
4 5 0
0
0
1 0

   Пример выходных данных:

1
2

   Обсуждение задачи

   Для решения задачи требуется знание фундаментального математического понятия "отношение" и, соответственно, понятия "замкнутость отношения". Кратко рассмотрим их.

   Бинарным отношение R двух множеств А и В называют подмножество прямого произведения А и В. Прямое (декартовое) произведение двух множеств А и В есть множество упорядоченных пар, в котором первый элемент каждой пары принадлежит А, а второй принадлежит В. Если А = В, то говорят, что R есть отношение на множестве А.

   Отношение R обладает обычно рядом свойств. Так, оно обладает свойством транзитивности, если для любых элементов a, b, c, принадлежащих А, из a R b и b R c следует, что a R c. Словами это проговаривается так: если a и b находятся в отношении R и b и c находятся в отношении R, то пара a и c также находятся в отношении R.

   Неформально говоря, замкнутость отношения относительно некоторого свойства означает, что многократное его применение не выводит нас за определенные границы. Задачу же нахождения по транзитивному отношению R отношения R*, обладающего свойством замкнутости, называют задачей замыкания, а отношение R* - транзитивным замыканием R.

   Для более детального ознакомления с решением, базирующимся на данном подходе, рекомендуем всем желающим обратиться к книге Кирюхин В.М., Окулов С.М. "Методика решения задач по информатике. Международные олимпиады", - М.: БИНОМ. Лаборатория знаний, 2007. - 600 с.: ил., где этот подход применительно к этой задаче детально разобран на стр. 148-154.

   Мы же приведем 2 других решения, одно из которых базируется на алгоритме Флойда-Уоршелла, а второе на понятии доминирующих множеств, с которыми рекомендуем разобраться самостоятельно.

Код:
var a,b,floyd,ad:array[1..100,1..100]of byte;
    fdi,fde,di,de:array[1..100]of byte;
    i,x,y,nr,min,nrcomp,nrext,j,k,l,m,n,nrctc:longint;
    luate:set of byte;
    bb:boolean;
    ctc:array[1..100]of set of byte;
    ss:string;

procedure dofloyd;
var i,j,k:byte;
begin
  for k:=1 to n do
      for i:=1 to n do
          for j:=1 to n do
              if floyd[i,k]+floyd[k,j]=2 then floyd[i,j]:=1;
  for i:=1 to n do
      for j:=1 to n do
          if a[i,j]=1 then
             begin
               inc(fdi[j]);
               inc(fde[i]);
             end;
end;

procedure calcctc;
begin
  b:=a;
  floyd:=a;
  dofloyd;
  a:=floyd;
  for i:=1 to n do
      for j:=1 to n do
          if a[i,j]+a[j,i]=1 then
             begin
               a[i,j]:=0;
               a[j,i]:=0;
             end;
  nrctc:=0;
  luate:=[];
  for i:=1 to n do
      if not(i in luate) then
      begin
        inc(nrctc);
        ctc[nrctc]:=[i];
        for j:=1 to n do
            if a[i,j]=1 then
               ctc[nrctc]:=ctc[nrctc]+[j];
        luate:=luate+ctc[nrctc];
      end;
  a:=b;
  for i:=1 to nrctc do
      for j:=1 to nrctc do
          if i<>j then
             for k:=1 to n do
                 if k in ctc[i] then
                    for l:=1 to n do
                        if l in ctc[j] then
                           if a[k,l]=1 then
                              ad[i,j]:=1;
end;

begin
  readln(n);
  nrcomp:=0;
  for i:=1 to n do
      begin
        read(j);
        while j<>0 do
          begin
            a[i,j]:=1;
            inc(de[i]);
            inc(di[j]);
            read(j);
          end;
      end;
  fillchar(ad,sizeof(ad),0);
  calcctc;
  for i:=1 to nrctc do
      begin
        di[i]:=0;de[i]:=0;
        for j:=1 to nrctc do
            if ad[i,j]=1 then inc(de[i]);
        for j:=1 to nrctc do
            if ad[j,i]=1 then inc(di[i]);
      end;
  k:=0;l:=0;
  for i:=1 to nrctc do
      if (di[i]=0)and(de[i]<>0)then inc(k);
  for i:=1 to nrctc do
      if (de[i]=0)and(di[i]<>0)then inc(l);
  for i:=1 to nrctc do
      if de[i]+di[i]=0 then begin inc(k);inc(l);end;
  m:=k;
  if l>k then k:=l;
  if nrctc=1 then
  k:=0;
  writeln(m);
  writeln(k);
end.
Код:
Const MaxN=200;           { max number of schools }
Type
  GraphType=Array[1..MaxN,0..MaxN] Of 0..MaxN;
  VertexSet=Set Of 1..MaxN;
Var
  N :Word;            { the number of schools }
  G: GraphType;       { representation of the network with graph G; }
                      { G[p,0] is the number of edges outgoing from p }
                      { the outgoing edges from p: (p, G[p,i]) 1<=i<=G[p,0]) }
  Domin,              { dominator set }
  CoDomin: VertexSet; { codominator set }
  NoDomins,           { number of dominator elements   }
  NoCoDomins: 0..MaxN;{ number of codominator elements }
  AnswerB: 0..MaxN;   { solution of subtask B }
  p: 0..MaxN;

Procedure ReadInput;
{ Global output variables: N, G }
  Var i,p: Word;
  Begin
    ReadLn(N);

    For i:=1 To N Do
      G[i,0]:=0;
    For i:=1 To N Do Begin
      Read(p);
      While p<>0 Do Begin
        Inc(G[i,0]);
        G[i,G[i,0]]:=p;
        Read(p);
      End;
      ReadLn;
    End;

End { ReadInput };

Procedure ComputeDomin(Const G: GraphType; Var D: VertexSet);
{ Computes a minimal dominator set D of graph G }
{ Global input variables: N }
  Var
    Dominated, Reachable: Set of 1..MaxN;
    p: 1..MaxN;

  Procedure Search(p:Word);
    Var i: Word;
  Begin
    Exclude(D, p);
    Include(Dominated, p);
    For i:= 1 To G[p,0] Do
      If Not (G[p,i] in Reachable) Then Begin
        Include(Reachable,G[p,i]);
        Search(G[p,i]);
      End;
  End { Search };

  Begin { ComputeDomin }
    D:=[];
    Dominated:=[];
    For p:=1 To N Do
      If Not (p In Dominated) Then Begin
        Reachable:=[p];
        Search(p);
        Include(D, p);
      End;
  End { ComputeDomin };

Procedure ComputeCoDomin(Const G: GraphType; Var CD: VertexSet);
{ Computes a minimal codominator set D of graph G }
{ Global input variables: N }
  Var
    GT: GraphType;           { transposed graph of G }
    p,q: 1..MaxN; i:Word;

  Begin { ComputeCoDomin }
    For p:=1 To N Do
      GT[p,0]:=0;
    For p:=1 To N Do         { compute the transpose of the graph G in GT }
      For i:=1 To G[p,0] Do Begin
        q:=G[p,i];
        Inc(GT[q,0]); GT[q,GT[q,0]]:=p;
      End;
  ComputeDomin(GT, CD)        { computes CD, the dominator set of GT }
  End;{ ComputeCoDomin }

Begin { Program }
  ReadInput;
  ComputeDomin(G,Domin);
  ComputeCoDomin(G,CoDomin);

  NoDomins:=0;
  For p:=1 To N Do     { count the number of elements in the set Domin }
    If p In Domin Then Inc(NoDomins);

  NoCoDomins:=0;
  For p:=1 To N Do     { count the number of elements in the set CoDomin }
    If p In CoDomin Then Inc(NoCoDomins);

  If (Domin=[1]) And (CoDomin=[1])  { strongly connected }
    Then AnswerB:=0
    Else If NoDomins > NoCoDomins
      Then AnswerB:=NoDomins
      Else AnswerB:=NoCoDomins;

  WriteLn(NoDomins);
  Writeln(AnswerB);
End.

Ну и конечно же, решение на С++. Очень интересный и полезный алгоритм. Также рекомендуем разобраться самостоятельно.

Код:
#include <iostream>
using namespace std;

const int N=101;
int gMap[N][N],nMap[N][N]; 
int mapNo[N];  
int connC;  
int inC[N],outC[N];  
bool vst[N];  
int n;  
int stack[N*N],sn;  

void DFS1(int x)  
{
    vst[x]=true;
    for(int i=1;i<=n;++i)
    {
        if(gMap[x][i] && ! vst[i])
        DFS1(i);
    }
    stack[++sn]=x;
}

void DFS2(int x,int mark)  
{
    vst[x]=true;
    mapNo[x]=mark;
    for(int i=1;i<=n;++i)
    {
        if(gMap[i][x] && ! vst[i])
        DFS2(i,mark);
    }
}

void Korasaju()
{
    int i,j;
    for(i=1;i<=n;++i)
    {
        if(! vst[i])
        DFS1(i);
    }
    memset(vst,false,sizeof(vst));
    for(i=sn;i>=1;--i)  
    {
        if(! vst[stack[i]])
        DFS2(stack[i],++connC);
    }
    for(i=1;i<=n;++i)  
    {
        for(j=1;j<=n;++j)
        {
            if(gMap[i][j] && mapNo[i]!=mapNo[j])
            nMap[mapNo[i]][mapNo[j]]=true;
        }
    }
}                  

bool Read()
{
    if(scanf("%d",&n)==EOF || n==-1)
    return false;
for(int i=1,t;i<=n;++i)
{
     while(scanf("%d",&t),t)
     gMap[i][t]=true;
    }
    return true;
}

void Solve()
{
    Korasaju();
    memset(inC,0,sizeof(inC));
    memset(outC,0,sizeof(outC));
    int i,j;
    for(i=1;i<=connC;++i)
    {
        for(j=1;j<=connC;++j)
        {
            if(nMap[i][j])
                ++outC[i],++inC[j];
        }
    }
    int zeroIn=0,zeroOut=0;
    for(i=1;i<=connC;++i)
    {
        if(inC[i]==0)
        ++zeroIn;
    if(outC[i]==0)
       ++zeroOut;
}      
printf("%d\n",zeroIn);
if(connC==1)
   puts("0");
else
      printf("%d\n",zeroIn>zeroOut ? zeroIn : zeroOut);
}

int main()
{
    while(Read())
    Solve();
    return 0;
}

0

2

Помогите пожалуйста!! Как этот код будет выглядеть на С#?

0

3

Копирую сделки с хорошей прибылью
D1O Декабрь 5, 2022
Эта брокерская компания богата на дополнительный функционал и сервис. Сначала я торговал на стандартном тарифе, с адекватными условиями. В принципе и сейчас приторговываю, но большую часть депозита я закинул в копирование сделок. Он тут сделан прекрасно и удобно. Сам настраиваешь свои обороты, свой риск-менеджмент, вся статистика перед лицом, в том числе и того трейдера, которого ты копируешь. Так что самое сложное, это по сути выбрать трейдера, который будет грамотно и прибыльно торговать. Я таких двух нашел, приносят мне в среднем по 12,48% ежемесячно, это уже после вычета всех комиссий.
Сам я приторговываю на небольшую сумму, но не вывожу прибыль, реинвестирую, постепенно раскачивая счет. Предпочитаю все-таки, чтобы деньги работали за меня.
В остальном брокер тоже хорош, как и по условиям, так и по качеству обслуживания.

Ответить

Да внесите уже эту кухню в ЧС
Alilo Декабрь 5, 2022
Давно пора уже внести эту поганую кухню в черный список. Развелось тут видите ли, всяких там компашек по форекс-торговле. Надоели уже скамить и кидать людей на деньги. Давно надо запретить весь этот балаган.

Ответить

Отличный дополнительный сервис
1988 Декабрь 10, 2022
Тут и обучающие курсы предоставят, и просто какие-то конкретные обучающие материалы. Я вот например изучал тему индикаторов, запросил много материала на эту тему, все прислали быстро на почту. Правда, я все равно так и не стал ими пользоваться, после изучения тема показалась гиблой, стандартная связка технического + фундаментального анализа работает более грамотно.
Тут и аналитика топовая. Тоже ее использую, не прямо голую аналитику беру, а связываю ее со своей торговой стратегий. Получается еще улучшенная стратегия.

Ответить

Тут мега тяжело торговать в плюс
SabaRahm Декабрь 17, 2022
У меня большие проблемы с торговлей в Esperio. Во-первых, терминал хоть и метатрейдер 5, но лагает супер-сильно. Не знаю, в чем проблема, потому что попробовал поторговать на том же метатрейдере 5, но только у другого брокера, там такой проблемы не наблюдается, все работает здорово. То есть трабла именно в этйо конторе. Во-вторых, спреды + комиссии. И ладно бы спреды и комиссии в совокупности были мелкими, но спреды еще куда не шло, они плавающие, но вот комиссионные тут сильно бьют по карману. Так что как торговать в плюс у этого посредника, я не понимаю.

Ответить

Все работает просто супер
marat Январь 7, 2023
Что такое Esperio? Это топовый дилинговый центр с опытом ведения деятельности более 10 лет. Мало какие брокерские компании даже до 5-летнего стажа-то доживают, так как эта индустрия мега конкурентная, но факт того, что эта фирма смогла, говорит о многом.
Сам я здесь торгую с конца 2021 года, то бишь чуть более, чем один год. Первые три месяца скорее привыкал, именно к комиссиям, к спредам. Сначала казалось, что это большие издержки, но потом подсчитал, что на самом деле издержки тут не выше, чем в среднем по рынку. Плавающие спреды весьма низкие, и практически никакого влияния не имеют, зато нет проблем с тем, что из-за спреда тебе закрывают позицию по стопу, хотя цена до этой отметки не заходила. Думаю, что многие форекс-трейдеры сталкивались с подобной проблемой, понимают, о чем я.
Выводы прибыли начал делать где-то на 4-5 месяца. Сначала небольшие суммы, по 200-300 долларов 1-2 раза в месяц. В сентябре 2022 года вывел первый раз крупную сумму в 2000 долларов. Пришли деньги нормально. К слову, KYC я сразу же прошел после регистрации, так что от брокера ко мне вопросов совсем не было. Ну вот так и продолжаю торговать, выводы от 1000-2000 долларов стабильно, все приходит в срок и вовремя.

Ответить

Мошенники да и все
vich Январь 11, 2023
Чтобы было понятнее – 99,99% брокерских компаний из офшоров типо Гренадин, во-первых, кухонные которые, которые не могут позволить себе доступ к ECN, а во-вторых, обманывают людей, начиная с информации о своей деятельности, и заканчивая выводами денег клиентов.
Я уверен на 100%, что у этого брокера есть много проблем, включая вывод средств. Он может давать выводить мелочь, до 100-200 баксов, но крупные суммы он вам с радостью забракует, так как они просто грабят его, ведь форекс тут не настоящий, а кухонный

Ответить

Офшорная грязная кухня
Альфа Январь 12, 2023
Мне вот кажется, что открывать депозит у брокера, который не имеет лицензии, да еще и зарегистрирован где-то в офшорной стране, не самая лучшая идея. Компании, которые находятся в Сент-Винсент и Гренадины, имеют слишком негативную репутацию. С такими брокерами лучше не начинать работать, так как они с легкостью, по щелчку пальцев, становятся скамами, и деньги из таких контор вытащить не представляется возможным.
Именно такой грязной офшорной кухней является Esperio. Не представляю, какие гарантии может эта кухня предоставить, кроме тупой бумажки, неимеющей никакого значения из SVGFSA.
Короче говоря, не вздумайте тут трейдить. Ничего нормального из этого не выйдет, лишитесь всех средств на изи-бризи.

Ответить

Нормальный мне брокер
Dan Январь 19, 2023
Как по мне нормальный брокер Эсперио. Сначала, да я много не зарабатывал, но сейчас я уже втянулся и имею нормально, по крайней мере я доволен. Деньги свои прибыльные выводил, проблем нет с этим. Но только вот единственный минус, недавно в подержку я не мог долго достучаться. А так в принципе нормально мне. Брокером доволен

Ответить

0

4

Top News Sites for Guest Post

docs.google.com/spreadsheets/d/10JY2ymIbDK9DnZsXT5LmoI_X1Gf4FHo9XXhKbolRiog

0

5

Hello.

This post was created with forex forum

Good luck :)

0

6

Маг Иннер - настоящий профессионал в своем деле! Я обратилась к нему за помощью в проведении ритуалов приворота, и результаты превзошли все мои ожидания. Иннер провел каждый ритуал с большим вниманием к моим потребностям, и я видела положительные изменения уже через короткое время. Благодаря его помощи я смогла привлечь к себе внимание мужчины моей мечты. Огромное спасибо Магу Иннеру за его талант и профессионализм.

маг иннер отзывы
иннер отзывы маг

любовный приворот восковая кукла

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » Информатика и математика » Байт решений задач с acm.pku » acm.pku 1236 Network of Schools