Informatika gyűjtemény

Egy szinttel feljebb mb_kepzes.cpp

2004050607080910

NézetNyomtat

mb_kepzes.cpp (Vissza)
Az alábbi letöltési lehetőségek közül választhatsz: (segítség)
Karakterkódolás:
Sortörés:
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: us-ascii
Méret: 1 KB
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <list>

using namespace std;

void beolvas();
void kiir();
bool szinez(int);

int n;

int* parent;
int* child_count;
list<int>* child;
bool* szin;
int szin_count=0;

int main()
{
    beolvas();
    szinez(1);
    kiir();
}

bool szinez(int num)
{
    if(child_count[num] == 0)
    {
        szin[num] = false;
        return false;
    }

    bool sz = false;

    list<int>::iterator it;
    for (it=child[num].begin() ; it != child[num].end(); it++)
        if(!szinez(*it))
            sz = true;

    szin[num]=sz;
    if(sz)
        szin_count++;
    return sz;
}

void beolvas()
{
    FILE* reader = fopen("kepzes.be", "r");
    fscanf(reader, "%d", &n);
    parent = new int[n+1];
    child_count = new int[n+1];
    fill(child_count, child_count+n+1, 0);
    child = new list<int>[n+1];
    szin = new bool[n+1];
    fill(szin, szin+n+1, false);

    int tmp;
    for(int i=1; i<=n; i++)
    {
        fscanf(reader, "%d", &tmp);

        parent[i] = tmp;
        child_count[tmp]++;
        child[tmp].push_back(i);
    }

    fclose(reader);
}

void kiir()
{
    FILE* printer = fopen("kepzes.ki", "w");
    fprintf(printer, "%d\r\n", szin_count);
    for(int i=1; i<=n; i++)
        if(szin[i])
            fprintf(printer, "%d ", i);
    fclose(printer);
}
(Vissza)