// 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;
}