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

Обсуждение задачи 1837. Число Исенбаева

Please help with DFS.
Послано freelife 10 фев 2013 03:12
What is the true way to change k-(needed numbers)
http://pastebin.com/f27Pt0HC - code
#include <iostream>;
#include <map>;
#include <string>;
using namespace std;
// dfs( копия матрицы, кол-во вершин, указатель на юзет, в который будут добавлятся числа Исенбаева, проверяемое ребро, число Исенбаева в данный момент)
int dfs(int **gr, int n, int *&q, int v, int k)
{
    for(int i=0;i<n;i++)
        if ( (gr[v][i]==-1)&&(q[i]==1000) )//если из v в i есть путь и если i не обойдена
        {
            q[i]=min(k,q[i]);//чтобы избавится от 1000
            dfs(gr,n,q,i,k+1);
        }
    return 1;
}


int main()
{

    int x,i,j,m,n;

    map<string,int> a;
    n=0;

    cin>>m;
    int **gr=new int*[3*m]; //матрица смежности
        for(int i=0;i<3*m;i++)
            gr[i]=new int[3*m];
    string s1,s2,s3;
    for(int i=0; i<m; i++)//ввод фамилий по 3 в строке
    {
        cin>>s1>>s2>>s3;
        if (a[s1]==0)
            a[s1]=++n;
        if (a[s2]==0)
            a[s2]=++n;
        if (a[s3]==0)
            a[s3]=++n;
        gr[ a[s1] ] [ a[s2] ] =-1;
        gr[ a[s2] ] [ a[s1] ] =-1;
        gr[ a[s3] ] [ a[s1] ] =-1;
        gr[ a[s1] ] [ a[s3] ] =-1;
        gr[ a[s3] ] [ a[s2] ] =-1;
        gr[ a[s2] ] [ a[s3] ] =-1;
    };
    int k=1;
    x=a["Isenbaev"];
    int *used=new int[n];
    for(int i=0;i<n;used[i++]=1000);
    int *&q=used;
    cout<<dfs(gr,n,used,x,1);
    i=0;
    used[x]=0;
    for(map<string,int>::const_iterator x=a.begin();x!=a.end();++x,i++)
        if(used[i]<1000)
            cout<<x->first<<' '<<used[i]<<endl;
        else
            cout<<x->first<<" undefined"<<endl;

    delete gr,used;
    return 0;
}