// возвращает список возможных атак через смежных пользователей public List <List <double> > get_attack(string user1, string user2) { List <List <double> > output = new List <List <double> > (); int _case = 0; /*foreach (KnowlegePattern p in SocGraphWithKP.Vertices) * if (p.G.)*/ // пользователи из одного отдела - используем сгенерированное // если нашли -> дальше не идем bool check = false; foreach (KnowlegePattern KP in SocGraphWithKP.Vertices) { if (KP.staff.Contains(user1) && KP.staff.Contains(user2)) { check = true; output.Add(KP.get_attack(user1, user2)); return(output); } } if (!check) { KnowlegePattern START_KP = null; KnowlegePattern FINISH_KP = null; // пользователи из разных отделов foreach (KnowlegePattern KP in SocGraphWithKP.Vertices) { if (KP.staff.Contains(user1)) { START_KP = KP; } else if (KP.staff.Contains(user2)) { FINISH_KP = KP; } // проверка на наличие связей между отделами for (int i = 0; i < START_KP.staff.Count; i++) { for (int j = 0; j < FINISH_KP.staff.Count; j++) { // 1 пользователь в 2 отделах -> просмотрим атаку через него if (START_KP.staff [i] == FINISH_KP.staff [j]) { output.Add(merge_attack_by_user(START_KP, FINISH_KP, user1, user2, START_KP.staff [i])); } Edge <string> e; if (this.G.social_graph.TryGetEdge(START_KP.staff [i], FINISH_KP.staff [j], out e)) { output.Add(merge_attack_by_edge(START_KP, FINISH_KP, user1, user2, e)); } } } } } return(output); }