// Dijkstra.cpp : // Find the shortest routine amoung A,B,C,D,E,F // From point A to point F, // #include "stdafx.h" #include <iostream> #include <string> using namespace std; #define MAX 0xFFFF #define N 6 class Node { private: string routine; int value; bool state; public: Node() { routine = ""; value = MAX; state = false; } void set_val(int v) { value = v; } void set_rout(string rou) { routine = rou; } void setstate(bool b) { state = b; } int get_val() { return value; } string get_rout() { return routine; } bool getstate() { return state; } }; int print_result(Node & node, int); int print_map(unsigned int [N][N]); int Dijkstra(unsigned int [N][N], Node *); int _tmain(int argc, _TCHAR* argv[]) { unsigned int map[N][N]; Node nodes[N]; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(i == j) { map[i][j] = 0; } else { map[i][j] = i * 3 - j + N; } } } for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { if(i < j) { map[i][j] = map[j][i]; } } } map[1][2] = map[2][1] = 1; print_map(map); Dijkstra(map, nodes); for(int i = 1; i < 6; ++i) { print_result(nodes[i], i); } system("pause"); return 0; } int print_map(unsigned int map [N][N] ) { cout << "The map is like this :" << endl << " "; for(int i = 0; i < N; ++i) { cout << (char)('A'+i) << " "; } cout << endl; for(int i = 0; i < N; ++i) { cout << (char)('A' +i) << " "; for(int j = 0; j < N; ++j) { if(map[i][j] < 10) { cout << map[i][j] << " "; } else { cout << map[i][j] << " "; } } cout << endl; } return 0; } int print_result(Node & node, int nodeid) { if(nodeid < 1 || nodeid >= N) { cout << "Invalid node id" << endl; return -1; } cout << "The shortest routine from A to " << (char)('A' + nodeid) << " is :" << endl; cout << node.get_rout() << endl << "The value is : " << node.get_val() << endl; return 0; } int Dijkstra(unsigned int map[N][N], Node *nodes) { unsigned int minid = 0; unsigned int min = MAX; unsigned int middleid = 0; unsigned int temp = 0; bool bridgemin = false; bool flag = true; for(int i = 1; i < N; ++i) { if(map[0][i] < min) { minid = i; min = map[0][i]; } } nodes[minid].setstate(true); nodes[minid].set_val(min); string oldrout = nodes[minid].get_rout(); string a = "A -> "; string b = " -> "; if(oldrout.compare("") == 0) { nodes[minid].set_rout(oldrout + a + (char)('A' + minid)); } else { nodes[minid].set_rout(oldrout + b + (char)('A' + minid)); } while(flag) { bridgemin = false; flag = false; min = MAX; for(int i = 1; i < N; ++i) { if(!nodes[i].getstate()) { if(map[0][i] < min) { bridgemin = false; flag = true; minid = i; min = map[0][i]; } for(int j = 1; j < N; ++j) { if(nodes[j].getstate()) { temp = nodes[j].get_val() + map[i][j]; if(temp < min) { flag = true; minid = i; middleid = j; bridgemin = true; min = temp; } } } } } if(flag) { nodes[minid].setstate(true); nodes[minid].set_val(min); oldrout = nodes[minid].get_rout(); if(!bridgemin) { if(oldrout.compare("") == 0) { nodes[minid].set_rout(a + (char)('A' + minid)); } else { nodes[minid].set_rout(oldrout + b + (char)('A' + minid)); } } else { nodes[minid].set_rout(nodes[middleid].get_rout() + b + (char)('A' + minid)); } } } return 0; }