提交 ed78725b 编写于 作者: 东方怂天's avatar 东方怂天

Add Grapg/Dijkatra.cpp

上级 834001d9
//Include the head file
#include <iostream>
//Import the namespace
using namespace std;
//Define some marco variable
#define MAXNUM 10
#define MAXSIZE MAXNUM *MAXNUM
//The var we need.
int VertexNum = 0; //Vertex number
int AM[MAXSIZE][MAXSIZE] = {0}; //Adjacency matrix
int Route[MAXNUM] = {0}; //The path length we walk last time.
bool S[MAXNUM] = {false}; //Set s, used to determine which is in the set
/*
This is the adjacency matrix.
Only for test.
0 3 4 0 0 0
3 0 6 10 0 0
4 6 0 3 2 0
0 10 3 0 2 2
0 0 2 2 0 4
0 0 0 2 4 0
*/
//Function we use.
void DisplayMartix(int D[][MAXSIZE]); //Display the martix
void DisplaySet(bool S[MAXNUM]); //Display the set
int main()
{
//Preparation
int i; //Common cycle control variables
//Get the vertex number.
cout << "Vertex num: ";
cin >> VertexNum;
//Get the adjacency matrix.
cout << "Adjacency matrix:" << endl;
for (i = 0; i < VertexNum - 1; i++)
{
for (int j = 0; j < VertexNum; j++)
{
cin >> AM[i][j];
}
}
//Show the adjacency martix.
DisplayMartix(AM);
//Start the dijkatra.
S[0] = true; //Push s1 to the set S.
int lasPathLen = 0, lasPos = 0; //Record last path and subscript
//Loop all nodes
for (int count = 1; count < VertexNum; count++)
{
//Show the elements in S.
DisplaySet(S);
//Computation path length
cout << 'U' << count << "U ";
for (i = 0; i < VertexNum; i++)
{
if (!S[i])
{
if (Route[i] == 0 && AM[lasPos][i] != 0)
{
Route[i] = AM[lasPos][i] + lasPathLen;
}
else
{
Route[i] = (AM[lasPos][i] + lasPathLen > Route[i]) ? Route[i] : (AM[lasPos][i] + lasPathLen);
}
cout << Route[i] << ' ';
}
}
cout << endl;
//Record the min element position.
int MIN = -1;
//To locate the min element position and value.
for (int i = 0; i < VertexNum; i++)
{
//If not in set
if (!S[i])
{
//If length is not infinite
//And the position i in route is alive.
if (Route[i] != 0 && (MIN == -1 || MIN > Route[i]))
{
lasPos = i;
MIN = Route[i];
}
}
}
S[lasPos] = true;
lasPathLen = MIN;
cout << "To " << lasPos + 1 << " min length " << lasPathLen << endl
<< endl;
}
}
//Display the martix
void DisplayMartix(int D[][MAXSIZE])
{
for (int i = 0; i < VertexNum; i++)
{
for (int j = 0; j < VertexNum; j++)
{
cout << D[i][j] << '\t';
}
cout << endl;
}
}
//Display the set
void DisplaySet(bool S[MAXNUM])
{
//Show the elements in S.
cout << "Set " << '\t';
for (int i = 0; i < VertexNum; i++)
{
if (S[i])
{
cout << i << ' ';
}
}
cout << endl;
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册