ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1487. Китайский футбол

Why this code get WA?
Послано Felix_Mate 16 авг 2016 16:21
Насколько я понял, есть орграф без циклов, при этом если из вершины v1 можно попасть в v2, из v2 в v3, то и из v1 можно попасть в v3 (дуга моделирует победу). Команда v1 лучше v2, если нет u, отличной от v1 и v2/ из u можно попасть в v1 и v2.

Код с WA2:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

const int nmax = 1005;

bool a[nmax][nmax];
int d[nmax], p[nmax];  //d[v]=0,если нет входящих дуг в v, p[v]-вершина u/ v достижима из u и d[v]=0.
bool used[nmax];
char ch;

int n, q, v, u;

void DFS(int v, int par);

void main()
{
    scanf("%d\n", &n);
    for (int i = 1; i <= n; i++)
    {
        d[i] = 0;
        used[i] = false;
    }

    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            scanf("%c", &ch);
            if (ch == '0') a[i][j] = 0;
            else a[i][j] = 1;
            d[j]+=a[i][j];
            if (j == n) scanf("\n");
        }
    }

    for (int i = 1; i <= n; i++)
    {
        if (d[i] == 0)
        {
            p[i] = i;
            DFS(i, i);
        }
    }

    scanf("%d\n", &q);
    for (int i = 1; i <= q; i++)
    {
        scanf("%d %d\n", &v, &u);
        if ((d[v] > 0) && (d[u] > 0) && (p[v] == p[u])) printf("No\n");
        else printf("YES\n");
    }
}

void DFS(int v, int par)
{
    used[v] = true;
    for (int i = 1; i <= n; i++)
    {
        if ((!used[i]) && (a[v][i] == 1))
        {
            p[i] = par;
            DFS(i, par);
        }
    }
}

Ошибка была в том, что из несколько вершин, не имеющих входные дуги, можно попасть в некоторую вершину.

Edited by author 03.01.2017 22:31