65,210
社区成员
发帖
与我相关
我的任务
分享#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);
}
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;
}