Bob103

C#_Graph

Oct 24th, 2017
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.70 KB | None | 0 0
  1.   class Graph
  2.     {
  3.         private List<Node> vertexes;
  4.         private List<Boolean> used = new List<bool>();
  5.  
  6.         class Node//вершина
  7.         {
  8.             public string name; //хранит название вершины
  9.  
  10.             //содержит названия вершин, к которым исходят дуги из данной вершины
  11.             public List<string> neighbours = new List<string>();
  12.  
  13.             //считывание строки
  14.             public Node(string parse)
  15.             {
  16.                 char[] separators =
  17.                 {
  18.                     ':',
  19.                     ','
  20.                 };
  21.  
  22.                 string[] parseResult = parse.Split(separators);
  23.                 name = parseResult[0];
  24.                 for (int i = 1; i < parseResult.Length; i++)
  25.                 {
  26.                     neighbours.Add(parseResult[i]);
  27.                 }
  28.  
  29.             }
  30.  
  31.             // выводит название вершины
  32.             public void print()
  33.             {
  34.                 if (neighbours.Count == 0)
  35.                 {
  36.                     Console.WriteLine("- Вершина " + name + " не имеет исходящих дуг.");
  37.                     return;
  38.                 }
  39.  
  40.                 Console.WriteLine("-Вершина " + name + ":");
  41.                 Console.WriteLine("Исходящие дуги:");
  42.                 foreach (var i in neighbours)
  43.                 {
  44.                     Console.WriteLine("" + name + "-> " + i + "");
  45.                 }
  46.             }
  47.  
  48.             /** добавляет в список вершин-"соседей"
  49.              * вершину с заданным именем
  50.              */
  51.             public void addEdge(string newEdge)
  52.             {
  53.                 neighbours.Add(newEdge);
  54.             }
  55.  
  56.             /** удаляет из списка вершин-"соседей"
  57.              * все вхождения deletedEdge
  58.              */
  59.             public void deleteEdge(string deletedEdge)
  60.             {
  61.                 while (neighbours.Remove(deletedEdge)) ;
  62.             }
  63.  
  64.             public void deleteEdge(int deletedEdge)
  65.             {
  66.                 for (int i = 0; i < neighbours.Count; i++)
  67.                 {
  68.                     if (int.Parse(neighbours[i]) == deletedEdge)
  69.                     {
  70.                         neighbours.RemoveAt(i);
  71.                     }
  72.                 }
  73.             }
  74.         }
  75.  
  76.  
  77.         public Graph()
  78.         {
  79.             vertexes = new List<Node>(); //пустой список вершин
  80.         }
  81.  
  82.  
  83.         public Graph(string filename)
  84.         {
  85.             vertexes = new List<Node>();
  86.             StreamReader fileReader = new StreamReader(filename);
  87.             string stringBuff;
  88.             while ((stringBuff = fileReader.ReadLine()) != null)
  89.             {
  90.                 addNode(stringBuff);
  91.                 used.Add(false);
  92.             }
  93.         }
  94.  
  95.         public Graph(Graph source)
  96.         {
  97.             vertexes = new List<Node>();
  98.             foreach (Node i in source.vertexes)
  99.             {
  100.                 vertexes.Add(i);
  101.             }
  102.         }
  103.  
  104.         /** Публичный конструктор Graph(int) создает полный граф с числами-названиями вершин по умолчанию. */
  105.         public Graph(int num)
  106.         {
  107.             vertexes = new List<Node>();
  108.             string buff;
  109.             for (int i = 0; i < num; i++)
  110.             {
  111.                 buff = Convert.ToString(i) + ":";
  112.                 for (int j = 0; j < num; j++)
  113.                 {
  114.                     if (j != i)
  115.                     {
  116.                         buff += Convert.ToString(j);
  117.                     }
  118.                 }
  119.                 addNode(buff);
  120.             }
  121.         }
  122.  
  123.         /** добавляет в список вершин новую
  124.          * принимая строку из файла
  125.          */
  126.         public void addNode(string parse)
  127.         {
  128.             vertexes.Add(new Node(parse));
  129.         }
  130.  
  131.         /** удаляет из списка вершин
  132.          * вершину с заданным именем nodeName, а также все
  133.          * её упоминания в списках вершин"соседей" остальных вершин.
  134.          */
  135.         public void deleteNode(string nodeName)
  136.         {
  137.             for (var i = 0; i < vertexes.Count; i++)
  138.             {
  139.                 if (nodeName == vertexes[i].name)
  140.                 {
  141.                     vertexes.Remove(vertexes[i]);
  142.                 }
  143.                 else
  144.                 {
  145.                     vertexes[i].deleteEdge(nodeName);
  146.                 }
  147.             }
  148.         }
  149.  
  150.         public void deleteNode(int x)
  151.         {
  152.             for (var i = 0; i < vertexes.Count; i++)
  153.             {
  154.                 if (x == int.Parse(vertexes[i].name))
  155.                 {
  156.                     vertexes.Remove(vertexes[i]);
  157.                 }
  158.                 else
  159.                 {
  160.                     vertexes[i].deleteEdge(x);
  161.                 }
  162.             }
  163.         }
  164.  
  165.         /**добавляет в число вершин-"соседей"
  166.          * вершины sourceNode вершину destinationNode, т.е. создаёт дугу из вершины sourceNode
  167.          * в вершину destinationNode.
  168.          */
  169.         public void addEdge(string sourceNode, string destinationNode)
  170.         {
  171.             try
  172.             {
  173.                 vertexes.Find(element => element.name == sourceNode).addEdge(destinationNode);
  174.             }
  175.             catch (Exception)
  176.             {
  177.                 Console.WriteLine("Такой исходящей/адресуемой вершины не существует");
  178.             }
  179.         }
  180.  
  181.         /** удаляет все имеющиеся в графе
  182.          * дуги с началом в вершине sourceNode и концом в вершине destinationNode.
  183.          */
  184.         public void deleteEdge(string sourceNode, string destinationNode)
  185.         {
  186.             vertexes.Find(element => element.name == sourceNode).deleteEdge(destinationNode);
  187.         }
  188.  
  189.         //выводит информацию обо всех вершинах
  190.         public void infoAboutGraph()
  191.         {
  192.             foreach (var i in vertexes)
  193.             {
  194.                 i.print();
  195.             }
  196.             Console.WriteLine();
  197.         }
  198.  
  199.         public void findDisconnectedNodes(string key)
  200.         {
  201.             var disnodes = vertexes.Where(x => x.name != key && !x.neighbours.Contains(key)).Select(x => x.name).ToArray();
  202.             Console.Write("Disconnected nodes: ");
  203.             foreach (var i in disnodes)
  204.             {
  205.                 Console.Write(i + " ");
  206.             }
  207.             Console.WriteLine();
  208.         }
  209.  
  210.         public void newGraphByDeleteEdges()
  211.         {
  212.             List<int> result = new List<int>();
  213.             for(int i = 0; i < vertexes.Count; i++)
  214.             {
  215.                 //ищем нечётную вершину в орграфе
  216.                 var res = vertexes.Where(x => x.neighbours.Contains((i+1).ToString())).Count()+vertexes[i].neighbours.Count;
  217.                 result.Add(res);
  218.             }
  219.  
  220.             for (int i = 0; i < result.Count; i++)
  221.             {
  222.                 if(result[i]%2!=0)
  223.                     vertexes[i].deleteEdge(vertexes[i].neighbours[0]);
  224.             }
  225.             infoAboutGraph();
  226.         }
  227.  
  228.         public void dfs(string key)
  229.         {
  230.             used[int.Parse(key) - 1] = true;
  231.             Console.Write(key+ " ");
  232.             for (int i = 0; i < vertexes[int.Parse(key) - 1].neighbours.Count; i++)
  233.             {
  234.                 if (!used[int.Parse(vertexes[int.Parse(key) - 1].neighbours[i]) - 1])
  235.                 {
  236.                     dfs(vertexes[int.Parse(key) - 1].neighbours[i]);
  237.                 }
  238.             }
  239.         }
  240.  
  241.         public void findRoot()
  242.         {
  243.             for (int i = 0; i < vertexes.Count; i++)
  244.             {
  245.                 Console.WriteLine();
  246.                 dfs((i + 1).ToString());
  247.                 if (used.All(x => x == true))
  248.                 {
  249.                     Console.WriteLine(i + 1 + "root");
  250.                     for (int j = 0; j < used.Count; j++)
  251.                     {
  252.                         used[j] = false;
  253.                     }
  254.  
  255.                 }
  256.                 else
  257.                     Console.WriteLine(i + 1 + "isn't root");
  258.             }
  259.         }
  260.     }
  261. /*****************INPUT FILE***********************
  262. 1:2,4
  263. 2:1,3
  264. 3:2,4
  265. 4:1,3,5
  266. 5:4
  267. *********************************************/
Advertisement
Add Comment
Please, Sign In to add comment