【算法】求最短路徑


// ConsoleApplication3.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
#define INF 10000
using namespace std;
const int maxSize = 100;


typedef struct MGraph{//鄰接矩陣
 int edges[maxSize][maxSize];
 int n, e;//頂點數和邊數

}MGraph;

void CreateMgraph(MGraph*&g)
{
 g = (MGraph*)malloc(sizeof(MGraph));
 /*
 cout << "輸入頂點數和邊數:" << endl;
 cin >> g->n >> g->e;
 for (int i = 0; i < g->n;++i)
  for (int j = 0; j < g->n; ++j)
  {
   if (i == j)
    g->edges[i][j] = 0;
   else
    g->edges[i][j] = INF;
  }
  cout << "輸入邊:" << endl;
  for (int k = 0; k < g->e; ++k)
  {
   int i, j;
   cin >> i >> j;
   cin >> g->edges[i][j];
  }
  */
 
 int a[4][4] = {  0, 10, 1, INF , INF, 0, INF, INF,INF, 5, 0, 2,INF, 3, INF, 0 };
 for (int i = 0; i < 4;++i)
 for (int j = 0; j < 4; ++j)
  g->edges[i][j] = a[i][j];
 g->n = 4;
 g->e = 5;
}

void PrintMgraph(MGraph *g)
{
 for (int i = 0; i < g->n; ++i)
 {
 
  for (int j = 0; j < g->n; j++)
   if (g->edges[i][j] != INF)
    cout << g->edges[i][j] << '\t';
   else
    cout << "INF" << '\t';
  cout << endl;
 }
}
void Dijkstra(MGraph *g, int v, int dist[], int path[])
{
 int set[maxSize];
 //初始化
 for (int j = 0; j < g->n; ++j)
 {
  dist[j] = g->edges[v][j];
  if (dist[j] < INF)
   path[j] = v;
  else
   path[j] = -1;
  set[j] = 0;
 }
 set[v] = 1;
 path[v] = -1;
 
 //開始求dist中路徑最短點
 for (int k = 0; k < g->n-1; ++k)
 {

  int u, min = INF;
  for (int i = 0; i < g->n; ++i)
  {
   if (set[i] == 0 && min>dist[i])
   {
    min = dist[i];
    u = i;
   }
  }
  set[u] = 1;//選中的頂點加入已集合
  for (int i = 0; i < g->n; ++i)//以u爲中間點更新最短路徑
  {
   if (set[i] == 0 && dist[i]>dist[u] + g->edges[u][i])
   {
    dist[i] = dist[u] + g->edges[u][i];
    path[i] = u;
   }
  }
 }
}
void PrintPath(int path[],int u)
{
 int Stack[maxSize];
 int top = -1;
 while (path[u] != -1)
 {
  Stack[++top] = u;
  u = path[u];
 }
 Stack[++top] = u;
 while (top != -1)
 {
  cout << Stack[top--] << "  ";
 }
  
  
 
}
void Floyd(MGraph*g, int path[][maxSize], int A[][maxSize])
{
 for (int i = 0; i < g->n;++i)
 for (int j = 0; j < g->n; ++j)
 {
  A[i][j] = g->edges[i][j];
  path[i][j] = -1;
 }
 for (int k = 0; k < g->n;++k)
  for (int i = 0; i < g->n;++i)
   for (int j = 0; j < g->n; ++j)
   {
    if (A[i][j]>A[i][k] + A[k][j])
    {
     A[i][j] = A[i][k] + A[k][i];
     path[i][j] = k;
    }
   }
}
void PrintPath(int path[][maxSize],int v,int u)
{
 if (path[v][u] == -1)
  cout << v << ' ' << u;
 else
 {
  int mid = path[v][u];
  PrintPath(path, v, mid);
  PrintPath(path, mid, u);
 }
}
int _tmain(int argc, _TCHAR* argv[])
{
 MGraph *g;
 CreateMgraph(g);
 PrintMgraph(g);
 int dist[maxSize];
 int path[maxSize];
 int v = 0;
 cout << "============================="<<endl;
 Dijkstra(g, v, dist, path);
 PrintPath(path, 3);

 cout << "\n==============================" << endl;
 int path1[maxSize][maxSize], A[maxSize][maxSize];
 Floyd(g, path1, A);
 for (int i = 0; i < g->n; ++i)
 {
  for (int j = 0; j < g->n; ++j)
   cout << A[i][j] << "\t" ;
  cout << endl;
 }


 if (A[0][1] < INF)
  PrintPath(path1,0,1);
 else
  cout << "沒有路徑" << endl;
 return 0;
}

 

發佈了26 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章