public void update_neighbor() { int sel = lb_vertex.SelectedIndex; if (sel != -1) { compV sV = compV.all_vertex[sel]; tb_firewall.Text = sV.firewall.ToString(); cb_neigbor.Items.Clear(); lb_neigbor.Items.Clear(); foreach (var a in compV.all_vertex) { if (a != sV && !sV.isNeighbor(a)) { cb_neigbor.Items.Add(a.ID); } else if (a != sV) { lb_neigbor.Items.Add(a.ID); } } if (cb_neigbor.Items.Count != 0) { cb_neigbor.SelectedIndex = 0; } } }
private void Button_Click_deleteOtherComp(object sender, RoutedEventArgs e) { int id1 = -1; try { id1 = int.Parse(tb_find_id.Text); if (!compV.used_id.Contains(id1)) { throw new Exception(); } } catch { MessageBox.Show("Некорректно заданы поля"); return; } compV st = compV.get_vertex(id1); List <compV> componenta = st.get_Componenta(); for (int i = 0; i < compV.all_vertex.Count; i++) { if (!componenta.Contains(compV.all_vertex[i])) { compV.all_vertex[i].remove_vertex(); i--; } } refresh(); update_neighbor(); }
private void Button_Click_checkTwoID(object sender, RoutedEventArgs e) { int id1 = -1; int id2 = -1; try { id1 = int.Parse(tb_id1.Text); id2 = int.Parse(tb_id2.Text); if (id1 == id2 || !compV.used_id.Contains(id1) || !compV.used_id.Contains(id2)) { throw new Exception(); } } catch { MessageBox.Show("Некорректно заданы поля", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error); return; } compV st = compV.get_vertex(id1); List <compV> componenta = st.get_Componenta(); foreach (var a in componenta) { if (id2 == a.ID) { MessageBox.Show("Вершины связанны между собой", "Результат работы", MessageBoxButton.OK); return; } } MessageBox.Show("Вершины не связанны между собой", "Результат работы", MessageBoxButton.OK); }
public static void remove_Edge(int ID1, int ID2)//удаление ребра при помощи двух ID { compV v1 = get_vertex(ID1); compV v2 = get_vertex(ID2); remove_Edge(v1, v2); }
public void AddEdge(compV vertex)//добавить ребро { if (!lst_neighbor.Contains(vertex)) { lst_neighbor.Add(vertex); vertex.lst_neighbor.Add(this); } }
public static void AddEdge_byID(int ID1, int ID2)//добавление ребра при помощи двух ID { if (ID1 != ID2) { compV v1 = get_vertex(ID1); compV v2 = get_vertex(ID2); v1.AddEdge(v2); } }
public bool isNeighbor(compV t)//является ли соседом через вершину { if (lst_neighbor.Contains(t)) { return(true); } else { return(false); } }
private void Button_Click_addneighbor(object sender, RoutedEventArgs e) { int sel = lb_vertex.SelectedIndex; if (sel != -1 && cb_neigbor.Items.Count > 0) { compV sV = compV.all_vertex[sel]; int id2 = int.Parse(cb_neigbor.SelectedItem.ToString()); compV.AddEdge_byID(sV.ID, id2); update_neighbor(); } }
private void Button_Click_deletevertex(object sender, RoutedEventArgs e) { int sel = lb_vertex.SelectedIndex; if (sel != -1) { compV sV = compV.all_vertex[sel]; sV.remove_vertex(); } refresh(); update_neighbor(); }
private void Button_Click_deleteneighbor(object sender, RoutedEventArgs e) { int sel = lb_vertex.SelectedIndex; if (sel != -1 && lb_neigbor.SelectedIndex != -1) { compV sV = compV.all_vertex[sel]; int id2 = int.Parse(lb_neigbor.SelectedItem.ToString()); compV.remove_Edge(sV.ID, id2); update_neighbor(); } }
public bool isNeighbor(int ID1)//является ли соседом через ID { compV t = get_vertex(ID1); if (lst_neighbor.Contains(t)) { return(true); } else { return(false); } }
public static List <compV> get_Componenta(compV v) //найти компоненту связности для произвольной вершины { List <compV> lst = new List <compV>(); //те вершины которые будут искать соседей List <compV> used = new List <compV>(); //использованные вершины lst.Add(v); while (lst.Count != 0) { compV t = lst[0]; used.Add(t); lst.Remove(t); foreach (var a in t.lst_neighbor) { if (!used.Contains(a) && !lst.Contains(a)) { lst.Add(a); } } } return(used); }
private void Button_Click_countComp(object sender, RoutedEventArgs e) { int id1 = -1; try { id1 = int.Parse(tb_find_id.Text); if (!compV.used_id.Contains(id1)) { throw new Exception(); } } catch { MessageBox.Show("Некорректно заданы поля", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error); return; } compV st = compV.get_vertex(id1); List <compV> componenta = st.get_Componenta(); tb_count_comp.Text = componenta.Count.ToString(); }
private void Button_Click_start(object sender, RoutedEventArgs e) { if (cb_start_vertex.SelectedIndex == -1) { return; } log_box.Clear(); compV start = compV.get_vertex(int.Parse(cb_start_vertex.SelectedItem.ToString())); List <compV> componenta = start.get_Componenta(); if (componenta.Count != compV.all_vertex.Count) { MessageBox.Show("Граф не связен.", "Внимание!"); return; } int count_algs = 0; int max_count_step = 0; try { count_algs = int.Parse(tb_count_algs.Text); max_count_step = int.Parse(tb_count_step.Text); if (count_algs < 0 || max_count_step < 0) { MessageBox.Show("Некорретно задано поле.", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error); } } catch { MessageBox.Show("Некорретно задано поле.", "Ошибка!", MessageBoxButton.OK, MessageBoxImage.Error); } List <compV> botnet = new List <compV>(); int total_step = 0; int botnet_fail = 0; for (int k = 0; k < count_algs; k++) { compV.refreshGraph(); botnet.Clear(); botnet.Add(start); start.status = true; int step = 1; int count = 1; log_box.Text += (k + 1) + " PASS" + "\r\n\r\n"; log_box.Text += "Start vertex = " + start.ID + "\r\n"; while (botnet.Count != compV.all_vertex.Count && max_count_step > step) { log_box.Text += "Step " + step + ":\r\n"; count = 0; int c = botnet.Count; for (int i = 0; i < c; i++) { List <compV> atLst = botnet[i].attack(); foreach (var j in atLst) { log_box.Text += (botnet[i].ID + " -> " + j.ID + " "); j.status = true; botnet.Add(j); count++; } } if (count != 0) { log_box.Text += "\r\nbotnet count = " + botnet.Count + " new= " + count + "\r\n"; } step++; } log_box.Text += "\r\n\r\n________________________________________________________________\r\n\r\n"; if (max_count_step == step) { botnet_fail++; } total_step += step; } tb_botnet_fail.Text = "Успешных защит = " + botnet_fail; tb_sred_step.Text = "Среднее количество шагов = " + (float)total_step / count_algs; cb_numAlg.Items.Clear(); for (int i = 0; i < count_algs; ++i) { cb_numAlg.Items.Add(i + 1); } if (cb_start_vertex.Items.Count != 0) { cb_numAlg.SelectedIndex = 0; } }
public static void remove_Edge(compV v1, compV v2)//удаление ребра при помощи двух вершин { v1.lst_neighbor.Remove(v2); v2.lst_neighbor.Remove(v1); }