Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2020
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.24 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.IO;
  7.  
  8. namespace Euler
  9. {
  10.  
  11.     class Graf
  12.     {
  13.         private int liczbaWierzcholkow;
  14.         private int liczbaKrawedzi;
  15.         private static int wielkosc=10;
  16.         public static List<int>[] lista = new List<int>[wielkosc];
  17.         public bool[] odwiedzony = new bool[lista.Length + 1];
  18.  
  19.         public Graf()
  20.         {
  21.             liczbaWierzcholkow = 0;
  22.             liczbaKrawedzi = 0;
  23.         }
  24.  
  25.         public void zbudujGraf()
  26.         {
  27.             Console.WriteLine("Podaj ilosc wierzcholkow: ");
  28.             liczbaWierzcholkow = Convert.ToInt32(Console.ReadLine());
  29.             Console.WriteLine("Podaj ilosc krawedzi: ");
  30.             liczbaKrawedzi = Convert.ToInt32(Console.ReadLine());
  31.  
  32.             for (int i = 0; i <= liczbaWierzcholkow; i++)
  33.                 lista[i] = new List<int>();
  34.  
  35.             for (int i = 1; i <= liczbaKrawedzi; i++)
  36.             {
  37.                 int w1, w2;
  38.                 Console.WriteLine("Krawędź: " + i + ": ");
  39.                 w1 = Convert.ToInt32(Console.ReadLine());
  40.                 w2 = Convert.ToInt32(Console.ReadLine());
  41.  
  42.                 lista[w1].Add(w2);
  43.                 lista[w2].Add(w1);
  44.             }
  45.             zapiszGraf();
  46.             Console.WriteLine();
  47.         }
  48.  
  49.         public void dodajKrawędź(int w1, int w2)
  50.         {
  51.             if (lista[w1].Count == 0)
  52.                 liczbaWierzcholkow++;
  53.  
  54.             if (lista[w2].Count == 0)
  55.                 liczbaWierzcholkow++;
  56.  
  57.             lista[w1].Add(w2);
  58.             lista[w2].Add(w1);
  59.             liczbaKrawedzi++;
  60.         }
  61.  
  62.         public void usuńKrawędź(int w1, int w2)
  63.         {
  64.             bool czyUsunieto = false;
  65.            
  66.             if (lista[w1].Count != 0)
  67.             {
  68.                 lista[w1].Remove(w2);
  69.                 lista[w2].Remove(w1);
  70.                 czyUsunieto = true;
  71.             }
  72.  
  73.             if (czyUsunieto == true)
  74.             {
  75.                 Console.WriteLine("Usunieto krawedz: "+ w1 + " -> " + w2);
  76.                 if (lista[w1].Count == 0)
  77.                     liczbaWierzcholkow--;
  78.  
  79.                 if (lista[w2].Count == 0)
  80.                     liczbaWierzcholkow--;
  81.  
  82.                 liczbaKrawedzi--;
  83.             }
  84.             else
  85.                 Console.WriteLine("Blad usuwania krawedzi! Podana krawedz " + w1 + " -> " + w2 + " nie istnieje.");
  86.  
  87.             zapiszGraf();
  88.             Console.WriteLine();
  89.         }
  90.  
  91.         public void wyświetlListęSąsiadów()
  92.         {
  93.             if (liczbaWierzcholkow == 0)
  94.                 Console.WriteLine("Graf jest pusty!");
  95.             else
  96.             {
  97.                 Console.WriteLine("Lista sasiedztwa wyglada nastepujaco: ");
  98.                 for (int i = 1; i < liczbaWierzcholkow + 1; i++)
  99.                 {
  100.                     Console.Write("Wierzcholek " + i + ": ");
  101.  
  102.                     for (int j = 0; j < lista[i].Count; j++)
  103.                     {
  104.                         if (j != lista[i].Count - 1)
  105.                             Console.Write(lista[i][j] +  ", ");
  106.                         else
  107.                             Console.WriteLine(lista[i][j] + " ");
  108.                     }
  109.                 }
  110.             }
  111.             Console.WriteLine();
  112.         }
  113.  
  114.         public void zapiszGraf()
  115.         {
  116.             StreamWriter zapisz = new StreamWriter("wyniki.txt");
  117.  
  118.             if (liczbaWierzcholkow == 0)
  119.                 Console.Write("Graf jest pusty!");
  120.             else
  121.                 for (int i = 1; i < liczbaWierzcholkow + 1; i++)
  122.                     for (int j = 0; j < lista[i].Count; j++)
  123.                             zapisz.WriteLine(i + " " + lista[i][j]);
  124.             zapisz.Close();
  125.         }
  126.  
  127.         public void wczytajGraf()
  128.         {
  129.             StreamReader odczytaj = new StreamReader("wyniki.txt");
  130.             string[] dane = new string[10];
  131.             int liczbaLinii = 0;
  132.  
  133.             if (File.Exists("wyniki.txt"))
  134.             {
  135.                 foreach (string line in File.ReadLines("wyniki.txt"))
  136.                 {
  137.                     if (line != String.Empty)
  138.                         liczbaLinii++;
  139.                 }
  140.  
  141.                 for (int i = 0; i < liczbaLinii; i++)
  142.                     dane[i] = odczytaj.ReadLine();
  143.  
  144.                 for (int i = 0; i <= liczbaLinii; i++)
  145.                     lista[i] = new List<int>();
  146.  
  147.                 for (int i = 0; i < liczbaLinii; i++)
  148.                 {
  149.                     int w1, w2;
  150.                     w1 = Convert.ToInt32(dane[i].Substring(0, dane[i].IndexOf(" ")));
  151.                     w2 = Convert.ToInt32(dane[i].Substring(dane[i].IndexOf(" ")));
  152.                     if (lista[w1].Count == 0)
  153.                         liczbaWierzcholkow++;
  154.  
  155.                     lista[w1].Add(w2);
  156.                     liczbaKrawedzi++;
  157.                 }
  158.             }
  159.             else
  160.                 Console.WriteLine("Nie można wczytać grafu! Nie zapisano żadnych krawędzi grafu.");
  161.  
  162.             odczytaj.Close();
  163.             Console.WriteLine();
  164.         }
  165.  
  166.         public void DFSHelper(int start, bool[] odwiedzony)
  167.         {
  168.             odwiedzony[start] = true;
  169.             Console.Write(start + "->");
  170.             if (lista[start] != null)
  171.                 foreach (var element in lista[start])
  172.                     if (!odwiedzony[element] == true)
  173.                         DFSHelper(element, odwiedzony);
  174.         }
  175.  
  176.         public void DFS(int wierzcholekStart)
  177.         {
  178.             Console.WriteLine("DFS");
  179.             DFSHelper(wierzcholekStart, odwiedzony);
  180.         }
  181.  
  182.         public int s=0;
  183.         public void Euler(int wierzcholekStart)
  184.         {
  185.             int[,] cykl = new int[wielkosc,wielkosc];
  186.             int[] wypiszCykl = new int[wielkosc];
  187.            
  188.             for (int i = 1; i < liczbaWierzcholkow + 1; i++)
  189.                 for (int j = 0; j < lista[i].Count; j++)
  190.                     cykl[i,j] = lista[i][j];
  191.  
  192.             for (int i = 0; i < liczbaWierzcholkow; i++)
  193.             {
  194.                 if (lista[i].Count % 2 != 0)
  195.                 {
  196.                     Console.WriteLine("Graf nie posiada Cyklu Eulera!");
  197.                     return;
  198.                 }
  199.             }
  200.             Console.WriteLine();
  201.            
  202.             for (int i = 0; i < liczbaWierzcholkow; i++)
  203.             {
  204.                 Nullable<int> value = cykl[wierzcholekStart,i];
  205.                 while (value.HasValue)
  206.                 {
  207.                     cykl[wierzcholekStart,i]--;      
  208.                     cykl[i,wierzcholekStart]--;
  209.                     Euler(i);        
  210.                 }
  211.                 wypiszCykl[s++] = wierzcholekStart;
  212.                 Console.Write(wypiszCykl[s++] + " -> ");
  213.             }
  214.         }
  215.  
  216.     }
  217.  
  218.  
  219.     class Program
  220.     {
  221.         static void Main(string[] args)
  222.         {
  223.             Graf g1 = new Graf();
  224.             g1.zbudujGraf();
  225.             //g1.wyświetlListęSąsiadów();
  226.             //g1.wczytajGraf();
  227.             //g1.usuńKrawędź(1, 3);
  228.             g1.wyświetlListęSąsiadów();
  229.             g1.DFS(1);
  230.             g1.Euler(1);
  231.  
  232.             Console.ReadKey();
  233.         }
  234.     }
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement