Найти кого - н друзей:
Для небольшой группы (набор данных), а есть Ь, друг, дружелюбие 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 * /