• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Algorytm Dijkstry

Object Storage Arubacloud
0 głosów
548 wizyt
pytanie zadane 29 grudnia 2020 w C i C++ przez wodzu_37 Nowicjusz (160 p.)

Mam do rozwiązania poniższe zadnie z zastosowaniem algorytmu Dijkstry. Mam napisane trochę kodu niestety nie wiem jak wprowadzić ten algorytmu

Firma spedycyjna przyjmuje towary w centrali, skąd rozsyła do odbiorców w całym kraju.
Trasy między miastami są zapisane w pliku w następujący sposób:
<miasto> <miasto> <odległość>
Przykładowy plik:
Szczecin Poznan 220
Szczecin Koszalin 110
Poznan Bytom 300
Poznan Lodz 130
Lodz Katowice 170
Bytom Katowice 15
Bytom Wroclaw 180
W wyniki działania programu zostanie tworzony plik z trasami spedycyjnymi w następującej
postaci (przykład dla centrali w Poznaniu):
Poznan -> Bytom: 300
Poznan -> Lodz -> Katowice: 300
Poznan -> Szczecin -> Koszalin: 330
Poznan -> Lodz: 130
Poznan -> Szczecin: 220
Poznan -> Bytom -> Wroclaw: 480
Trasy spedycyjne mają najkrótsze możliwe długości. Należy wykorzystać algorytm Dijkstry.
Program uruchamiany jest z linii poleceń z potrzebnymi przełącznikami, natomiast
uruchomienie programu bez parametrów powoduje wypisanie krótkiej instrukcji.

 

#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <utility>

//#include "def.cpp"
//#include "funkcje.h"

using namespace std;
struct Node {
    string city;
    vector<pair<unsigned, unsigned>> connections;
};

int findOrAddCity(vector<Node>& g, const string& name)
{
    for (int i = 0; i < g.size(); i++)
        if (g[i].city == name) return i;

    g.push_back({ name, {} });
    return g.size() - 1;
}
int wczytaj_arg(int argc, char* argv[])
{
  
        int pozI = 0;
        int pozC = 0;
        string nPlikuI = "";
        string nPlikuC = "";
        string plik, centrala;
        if (argc == 5)
        {
            for (int i = 0; i < argc; i++) {
                if ((string(argv[i]) == "-i") and i < argc - 1) {
                    pozI = i + 1;
                    plik = argv[pozI];
                }
                if ((string(argv[i]) == "-c") and i < argc - 1) {
                    pozC = i + 1;
                    centrala = argv[pozC];
                }
            }
            cout << "\nNazwa pliku wejściowego : " << plik << endl;
            cout << "Nazwa Centrali: " << centrala << endl;

        }
        else
        {
            cout << "ZŁE ARGUMENTY\n" << "PODAJ : \n\n" << "-i nazwa pliku wejsciowego \n -c nazwa centrali\n";
        }
        return pozI;
    }

int main(int argc, char* argv[])
{
    
    fstream plik1;
    string linia;
	system("chcp 1250");
	system("cls");
	
	wczytaj_arg(argc, argv);
	string nazwa_pliku = argv[2];
	
    plik1.open(nazwa_pliku);
    if (plik1.good() == true)
    {
       
           
     
        while (!plik1.eof()) {
            getline(plik1, linia);
            istringstream ifs(linia);


            vector<Node> graph;
            string n1, n2;
            unsigned dist;

            while (ifs >> n1 >> n2 >> dist) {
                int i1 = findOrAddCity(graph, n1);
                int i2 = findOrAddCity(graph, n2);
                graph[i1].connections.push_back(make_pair(i2, dist));
            }


            for (auto& i : graph) {
                cout << i.city;

                for (auto& c : i.connections)
                    cout << graph[c.first].city << " - " << c.second << endl;
                
            }

        }
        cout << endl;
        plik1.close();

    }
    else cout << "\n\tBłąd otwarcia pliku";


}

 

komentarz 29 grudnia 2020 przez wojtek_suchy Mądrala (6,880 p.)
https://eduinf.waw.pl/inf/alg/001_search/0138.php bierzesz ten o groszej złożoności czasowej i już masz wszystkie drogi wraz z kosztem
komentarz 30 grudnia 2020 przez j23 Mędrzec (194,920 p.)

@wodzu_37, poprawiłem twojego maina, bo trochę bezsensów tam jest:

int main(int argc, char* argv[])
{
	system("chcp 1250");
	system("cls");

	wczytaj_arg(argc, argv);
	std::string nazwa_pliku = argv[2];

	std::ifstream ifs(nazwa_pliku);
	std::vector<Node> graph;
	std::string n1, n2;
	unsigned dist;

	while (ifs >> n1 >> n2 >> dist) {
		int i1 = findOrAddCity(graph, n1);
		int i2 = findOrAddCity(graph, n2);
		graph[i1].connections.push_back(std::make_pair(i2, dist));
	}

	for (auto& i : graph) {
		cout << i.city;
		for (auto& c : i.connections)
			std::cout << graph[c.first].city << " - " << c.second << '\n';
	}

	return 0;
}

 

komentarz 4 stycznia 2021 przez wodzu_37 Nowicjusz (160 p.)

Wkleiłem twój kod i jest coś takiego , jak to naprawić?

komentarz 4 stycznia 2021 przez j23 Mędrzec (194,920 p.)

Pokaż zawartość plik.txt.

komentarz 4 stycznia 2021 przez wodzu_37 Nowicjusz (160 p.)
Szczecin- Poznan 220
Szczecin- Koszalin 110
Poznan- Bytom 300
Poznan- Lodz 130
Lodz- Katowice 170
Bytom- Katowice 15
Bytom- Wroclaw 180

 

komentarz 4 stycznia 2021 przez j23 Mędrzec (194,920 p.)

A co te minusy robią za nazwami miast startowych? Przecież nazwy Bytom i Bytom- są traktowane jak dwa różne miasta.

Popraw wyświetlanie na:

for (auto& i : graph) {
    std::cout << i.city << '\n';
    for (auto& c : i.connections)
        std::cout << '\t' << graph[c.first].city << " - " << c.second << '\n';
}

Nieco czytelniej będzie.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 425 wizyt
0 głosów
0 odpowiedzi 365 wizyt
0 głosów
0 odpowiedzi 291 wizyt
pytanie zadane 10 maja 2020 w Matematyka, fizyka, logika przez miko1282 Nowicjusz (240 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...