Huawei пен вопросы 2

Найти кого - н друзей: 
Для небольшой группы (набор данных), а есть Ь, друг, дружелюбие X; Ь с, друзья, дружелюбие Y, а а и с не друзьями, а затем сказал с 2 градусов друг а, дружелюбная степень х + у; б 1 градус друг а, удобство х, в
настоящее время ввода данных:
строка 1: Т, представитель в общей сложности п наборов данных, такие как ниже 2;
первый от 2 до 3 линии: соответственно , ввести различные параметры первых данных
  строки 2: M, I, п;
    т = 10 представляет эту группу из 10 людей, каждый человек , пронумерованного от 0 ~ 9;.
    I = 5 представителя искать. № 5, отношения человек приятель;
    п-2 = запрос от имени друга 2 N 5, не выход 1, если, в соответствии с дружественности порядке убывания, если дружественность же, расположенных в порядке возрастания числа людей , ;
  строка 3: а = 13 первое число представляет собой первую группу , в общей сложности 13 друга отношений, степень дружбы 0 3 0 5 3 и № 5, и так далее;
выход в последовательности: I-го числа п друзья, если Т равно 2 , то два соотношений для вывода;
2 10. 5 2 13 опускаются позже 5 ... 0. 3

C ++ код:

#include <iostream> 
#include <вектор> 
#include < строка > 
#include <очереди> 
#include <алгоритм>
 с помощью  пространства имен STD;
BOOL CMP (вектор < INT > а, вектор < INT > б) {
     вернуть а [ 1 ]> б [ 1 ]; 
} 
INT основных () {
     INT Т; 
    CIN >> Т;
    для ( Int ID = 0 ; ID <Т; ID ++ ) {
         INT м, I, N; 
        CIN>> M >> I >> п;
        ИНТ к; 
        CIN >> к;
        // 朋友圈图初始化 
        вектор <вектор < INT >> г (м, вектор < INT > (м, 0 ));
        для ( Int х = 0 , х <к; х ++ ) {
             Int а, б, ш; 
            CIN >> A >> б >> ш; 
            г [а] [б] = г [Ь] [а] = ш; 
        } 
        Вектор < INT > Визит (м, 0 ); 
        Очередь < INT > д; 

        //Инициализация друга 
        для ( междунар X = 0 , X <т; X ++ ) {
             IF (G [I] [X] =! 0 {) 
                q.push (X), 
                посещение [X] = G [I] [X ]; 
            } 
        } 
        // BFS
         // первый слой, н-градусный найти друг 
        для ( INT X = 1. , X <п; X ++ ) {
             INT Len = q.size ();
             // второго уровня тока, Конец друзей найти, друзей у; 
            для ( INT у = 0 ; у <длина, у ++ ) {
                 INT а =q.front (); 
                q.pop (); 
                // третий уровень текущей следующей ступени х прогностического все друзья 
                для ( INT Z = 0 ; Z <т; Z ++ ) {
                     IF (Z = I! G && [А] [Z] =! 0 && посещения [Z] == 0 ) { 
                        q.push (Z); 
                        Посещение [Z] = Визит [А] + С [А] [Z]; 
                    } 
                    IF (посещение ! [Z] = 0 && Посетить домашнюю страницу [Z] <Посетить домашнюю страницу [A] + G [A] [Z]) Посетить домашнюю страницу [Z] = Посетить [A] + G [A] [Z]; 
                } 
            } 
        } 
        Вектор < INT > NDF;
        если (q.size () == 0 ) { 
            соиЬ << - 1 << епсИ; продолжить ; 
        } Еще {
             в то время как (! {Q.empty ()) 
                ndf.push_back (q.front ()); 
                q.pop (); 
            } 
        } 
        INT max_x = ndf.size (); 
        вектор <вектор < INT >> Рез; 

        сортировать (ndf.begin (), ndf.end ()); 

        для ( INT х = 0 ; х <max_x; х ++ ) { 
            вектор < INT >клетка; 
            cell.push_back (NDF [х]); 
            cell.push_back (посетить [NDF [X]]); 
            res.push_back (клетка); 
        } 
        Рода (res.begin (), res.end (), CMP); 
        для ( Int х = 0 , х <max_x; х ++ ) { 
            COUT << разреш [х] [ 0 ] << "  " ; 
        } 
        СоиЬ << епсИ; 
    } 
    Возвращает  0 ; 
} 

/ * 
2 
10 5 2 
13 0 3 5 0 4 9 0 6 8 0 7 5 1 2 6 1 6 3 2 9 7 3 4 3 3 5 3 3 8 3 3 9 3 5 8 9 7 8 9 
10 0 2
13 0 3 0 5 4 9 0 6 0 8 7 1 2 5 6 1 6 3 2 9 7 3 4 3 3 3 3 5 8 3 9 3 3 5 8 9 7 8 9 
* /

 

рекомендация

отwww.cnblogs.com/joelwang/p/11440510.html
рекомендация