sh_totti Ответов: 1

Как выбрать 3 кратчайших путей для каждой потребности ( пара источника и усилителя; пунктом)


У меня есть проект в моем университете, учитывая топологию сети и список требований ( пара источника и назначения), чтобы получить все пути для каждого требования, а затем я должен выбрать 3 кратчайших пути. с тех пор как я впервые столкнулся с программированием, мне было довольно трудно понять, как это сделать правильно.

то, что я пытаюсь сделать, - это получить все доступные пути между каждой парой источников и назначением { int sources[k]={1,2,4,5}; int destinations[k]={3,4,5,1} } и в соответствии с количеством прыжков ( вершин ) каждого пути выбрать 3 самых коротких из доступных путей для каждого требования [ пары источника и назначения ].
код может получить все пути для каждого требования (т. е. s=1& d=3), но я не знаю, как выбрать из этих доступных путей 1-й кратчайший путь 3, любая помощь очень ценится. .

Что я уже пробовал:

// C++ program to print all paths from a source to destination.
	#include<iostream>
	#include <list>
	using namespace std;

	// A directed graph using adjacency list representation
	class Graph
	{
		int V; // No. of vertices in graph
		list<int> *adj; // Pointer to an array containing adjacency lists

		// A recursive function used by printAllPaths()
		void printAllPathsUtil(int , int, bool [], int [], int &);

	public:
		Graph(int V); // Constructor
		void addEdge(int u, int v);
		void printAllPaths(int s, int d);
void printShortestPaths(int s, int d);

			int k; 
			int sources;
			int destinations;
                        int id=0;  
	};

	Graph::Graph(int V)
	{
		this->V = V;
		adj = new list<int>[V];
	}

	void Graph::addEdge(int u, int v)
	{
		adj[u].push_back(v); // Add v to u’s list.
	}

	// Prints all paths from 's' to 'd'
	void Graph::printAllPaths(int s, int d)
	{
		// Mark all the vertices as not visited
		bool *visited = new bool[V];

		// Create an array to store paths
		int *path = new int[V];
		int path_index = 0; // Initialize path[] as empty
               
		// Initialize all vertices as not visited
		for (int i = 0; i < V; i++)	
                    visited[i] = false;
		// Call the recursive helper function to print all paths
		printAllPathsUtil(s, d, visited, path, path_index);            
	}

	// A recursive function to print all paths from 'u' to 'd'.
	// visited[] keeps track of vertices in current path.
	// path[] stores actual vertices and path_index is current
	// index in path[]
	void Graph::printAllPathsUtil(int u, int d, bool visited[],
                                        int path[], int &path_index)
                    {
                        int id_path[40][V-1]; //40 is an example as maximum number of paths 
                        bool id_hops[40];

                    for (int i = 0; i< 40; i++)
                        for (int j = 0; j< V-1; j++)
                            id_path [i][j]=0;
                    for (int i = 0; i< 40; i++)
                            id_hops [i]=0;
		// Mark the current node and store it in path[]
                visited[u] = true;
		path[path_index] = u;
		path_index++;
                int hops = path_index -1;
		// If current vertex is same as destination, then print
		// current path[]
		if (u == d)
                   {
                    if(hops && path)
                        id++;
                        id_hops[id-1]= hops;
                    for (int i = 0; i< path_index; i++)
                       if (path[i]!=0) 
                        id_path[id-1][i]=path[i];
                        cout << "Path_ID = " << id << " Path is : ";   
                    for (int i = 0; i< path_index; i++)
                        cout << path[i] << " ";
                        cout << "Number of hops = " << hops << endl;
                    }
		else // If current vertex is not destination
                    {
			// Recur for all the vertices adjacent to current vertex
			list<int>::iterator i;
                    for (i = adj[u].begin(); i != adj[u].end(); ++i)
			if (!visited[*i])
			printAllPathsUtil(*i, d, visited, path, path_index);
                    }

		// Remove current vertex from path[] and mark it as unvisited
                    path_index--;
                    visited[u] = false;
                    int id_Sorted[3]; //id_Sorted contains the 3 ids of the shortest paths

                for (int j=0; j<3; j++)
                    id_Sorted[j]=0;
            //we select these 3 ids
                    int min=0; //the shortest 
                for (int j=0; j<2; j++)
                   {
                    for (int i=1; i<40; i++)     
                        if ((i!= id_Sorted[0])&& (i!= id_Sorted[1]))
                            {
                                if  (id_hops[i]< id_hops[min])
                                        min=i;
                            }
                    id_Sorted[j]=min;
                    }
        //creation of id_pathShort
                    int id_pathShort[3][V-1];
                for (int j=0; j <= 2; j++)
                   {            
                    cout <<  "Path_ID_Short = " << j << " Path_short is : ";   
                        for (int i=0; i<V-1; i++)
                           {
                            id_pathShort[j][i]=id_path[id_Sorted[j]][i];
                            if (id_pathShort[j][i]) 
                             cout  << id_pathShort[j][i] << " ";
                           }
                             cout << "Number of hops_short = " << id_hops[id_Sorted[j]] << endl;
                   }
}
	// Driver program
	int main()
	{
		// Create a graph given in the above diagram
		Graph g(7);
			g.addEdge(1, 2);
			g.addEdge(2, 1);
			g.addEdge(1, 6);
			g.addEdge(6, 1);
			g.addEdge(2, 6);
			g.addEdge(6, 2);
			g.addEdge(2, 3);
			g.addEdge(3, 2);
			g.addEdge(3, 4);
			g.addEdge(4, 3);
			g.addEdge(3, 5);
			g.addEdge(5, 3);
			g.addEdge(4, 5);
			g.addEdge(5, 4);
			g.addEdge(5, 6);
			g.addEdge(6, 5);
		                        
		for (int k=0;k<=2; k++)
			{ int sources[k]={1,2,4,5};
			  int destinations[k]={3,4,5,1};
			  int s= sources[k];
			  int d= destinations[k];
                         
		 if( true){
		cout << "Following are all different paths from " << s
                    << " to " << d << endl;
		g.printAllPaths(s, d);
               }
	    };
	   return 0;
	}

1 Ответов

Рейтинг:
1

KarstenK

Когда у вас есть пути, вы должны реализовать некоторый код, который вычисляет длину. Чем сравнивать. Звучит так просто...

Начните с того, какая длина имеет ребро между узлами, чем суммировать.