#include<iostream>
using namespace std;
#define N 10000
typedef struct Net{
int **weight;
int numNodes;
}Net,*NetPtr;
NetPtr initNet(int paraSize,int** paraData){
NetPtr resultPtr=(NetPtr)malloc(sizeof(Net));
resultPtr->numNodes=paraSize;
resultPtr->weight=(int**)malloc(sizeof(int*)*paraSize);
for(int i=0;i<paraSize;i++){
resultPtr->weight[i]=(int*)malloc(sizeof(int)*paraSize);
for(int j=0;j<paraSize;j++){
resultPtr->weight[i][j]=paraData[i][j];
}
}
return resultPtr;
}
int dijkstraOrPrim(NetPtr paraPtr,int paraAlgorithm){
int source=0;
int numNodes=paraPtr->numNodes;
int minDistance,tempBestNode,resultCost;
int* distanceArray=(int*)malloc(sizeof(int)*numNodes);
int* parentArray=(int*)malloc(sizeof(int)*numNodes);
int* visitArray=(int*)malloc(sizeof(int)*numNodes);
for(int i=0;i<numNodes;i++){
distanceArray[i]=paraPtr->weight[source][i];
parentArray[i]=source;
visitArray[i]=0;
}
distanceArray[source]=0;
parentArray[source]=-1;
visitArray[source]=1;
tempBestNode=-1;
for(int i=0;i<numNodes-1;i++){
minDistance=N;
for(int j=0;j<numNodes;j++){
if(visitArray[j])
continue;
if(minDistance>distanceArray[j]){
minDistance=distanceArray[j];
tempBestNode=j;
}
}
visitArray[tempBestNode]=1;
for(int j=0;j<numNodes;j++){
if(visitArray[j]||paraPtr->weight[tempBestNode][j]>=N)
continue;
if(!paraAlgorithm){
if(distanceArray[j]>distanceArray[tempBestNode]+paraPtr->weight[tempBestNode][j]){
distanceArray[j]=distanceArray[tempBestNode]+paraPtr->weight[tempBestNode][j];
parentArray[j]=tempBestNode;
}
}
else{
if(distanceArray[j]>paraPtr->weight[tempBestNode][j]){
distanceArray[j]=paraPtr->weight[tempBestNode][j];
parentArray[j]=tempBestNode;
}
}
}
}
printf("the parent of each node: ");
for (int i=0;i<numNodes;i++){
printf("%d, ",parentArray[i]);
}
if(paraAlgorithm==0){
printf("From node 0, path length to all nodes are: ");
for(int i=0;i<numNodes;i++) {
printf("%d (%d), ",i,distanceArray[i]);
}
}
else{
resultCost=0;
for (int i=0;i<numNodes;i++){
resultCost+=distanceArray[i];
printf("cost of node %d is %d, total = %d\r\n",i,distanceArray[i],resultCost);
}
printf("Finally,the total cost is %d.\r\n ",resultCost);
}
printf("\r\n");
return resultCost;
}
NetPtr constructSampleNet(){
int myGraph[6][6]={
{0, 6, 1, 5, 0, 0},
{6, 0, 5, 0, 3, 0},
{1, 5, 0, 5, 6, 4},
{5, 0, 5, 0, 0, 2},
{0, 3, 6, 0, 0, 6},
{0, 0, 4, 2, 6, 0}};
int** tempPtr;
int numNodes=6;
printf("Preparing data\r\n");
tempPtr=(int**)malloc(numNodes*sizeof(int*));
for (int i=0;i<numNodes;i++){
tempPtr[i]=(int*)malloc(numNodes*sizeof(int));
}
for (int i=0;i<numNodes;i++){
for(int j=0;j<numNodes;j++){
if(myGraph[i][j]==0){
tempPtr[i][j]=N;
}
else{
tempPtr[i][j]=myGraph[i][j];
}
}
}
printf("Data ready\r\n");
NetPtr resultNetPtr=initNet(numNodes,tempPtr);
return resultNetPtr;
}
void testPrim(){
NetPtr tempNetPtr=constructSampleNet();
printf("=====Dijkstra algorithm=====\r\n");
dijkstraOrPrim(tempNetPtr,0);
printf("=====Prim algorithm=====\r\n");
dijkstraOrPrim(tempNetPtr,1);
}
int main(){
testPrim();
return 0;
}
迪杰斯特拉和普利姆算法(朴素版)
最新推荐文章于 2024-07-24 22:13:06 发布