#include<stdio.h>
#include<stdlib.h>
#define TypeE int
#define TypeV int
#define MaxVertexNum 20
#define MAXSIZE 69999
typedef struct {
TypeE G[MaxVertexNum][MaxVertexNum];
TypeV vex[MaxVertexNum];
TypeE numEdges;
TypeV numVertexes;
}MGraph;
typedef struct QNode {
int data;
struct QNode* next;
}QNode , *QueuePtr;
typedef struct
{
QueuePtr front, rear;
}LinkQueue;
void ShowGraph(MGraph* p)
{
int i, j;
printf("\n顶点数据:\t");
for (i = 0; i < p->numVertexes; i++) {
printf("%d ", p->vex[i]);
}
printf("\n邻接矩阵: \n");
for (i = 0; i < p->numVertexes; i++) {
for (j = 0; j < p->numVertexes; j++) {
printf("%d ", p->G[i][j]);
}
printf("\n");
}
}
MGraph* CreateNode()
{
MGraph* p = (MGraph*)malloc(sizeof(MGraph));
if (p)
return p;
else
return NULL;
}
void CreateGraph(MGraph* p)
{
int i, j, k, w;
printf("顶点数:\t");
scanf_s("%d", &p->numVertexes);
printf("边数:\t");
scanf_s("%d", &p->numEdges);
printf("输入顶点数据:\n");
for (i = 0; i < p->numVertexes; i++)
scanf_s("%d", &p->vex[i]);
for (i = 0; i < p->numVertexes; i++) {
for (j = 0; j < p->numVertexes; j++) {
p->G[i][j] = MAXSIZE;
if (i == j) p->G[i][j] = 0;
}
}
for (k = 0; k < p->numEdges; k++) {
printf("输入G<i,j>中下标i,j以及权w :\n");
scanf_s("%d %d %d", &i, &j, &w);
p->G[i][j] = w;
p->G[j][i] = p->G[i][j];
}
}
void ShortestPath_Dijkstra(MGraph* p, int* P, int* D, int V0)
{
int i, j, k = 0;
int finish[MaxVertexNum];
int min = MAXSIZE;
for (i = 0; i < p->numVertexes; i++)
{
finish[i] = 0;
D[i] = p->G[V0][i];
P[i] = 0;
}
finish[V0] = 1;
D[V0] = 0;
for (i = 1; i < p->numVertexes; i++)
{
min = MAXSIZE;
for (j = 0; j < p->numVertexes; j++)
{
if (!finish[j] && D[j] < min) {
min = D[j];
k = j;
}
}
finish[k] = 1;
for (j = 0; j < p->numVertexes; j++)
{
if (!finish[j] && min + p->G[k][j] < D[j]) {
D[j] = min + p->G[k][j];
P[j] = k;
}
}
}
printf("\n单源最短路径:\n");
for (i = 0; i < p->numVertexes; i++) {
printf("V%d到V%d的最短路径为 %d\n", V0, i, D[i]);
printf("V%d<-V%d : ", p->numVertexes - 1 - i, V0);
for (j = p->numVertexes - 1 - i; P[j] != j; j = P[j]) {
printf("V%d<-", j);
}
printf("V%d\n", j);
}
}
int P1[MaxVertexNum][MaxVertexNum];
int D1[MaxVertexNum][MaxVertexNum];
void ShortestPath_Floyd(MGraph* p)
{
int i, j, k;
for (i = 0; i < p->numVertexes; i++) {
for (j = 0; j < p->numVertexes; j++) {
D1[i][j] = p->G[i][j];
P1[i][j] = j;
}
}
for (k = 0; k < p->numVertexes; k++) {
for (i = 0; i < p->numVertexes; i++) {
for (j = 0; j < p->numVertexes; j++) {
if (D1[i][k] + D1[k][j] < D1[i][j]) {
D1[i][j] = D1[i][k] + D1[k][j];
P1[i][j] = P1[i][k];
}
}
}
}
printf("\n多源最短路径:\n");
for (i = 0; i < p->numVertexes; i++) {
for (j = i + 1; j < p->numVertexes; j++) {
k = P1[i][j];
while (k != j) {
printf("->V%d", k);
k = P1[k][j];
}
printf("->V%d", k);
}
printf("\n");
}
}
int visited[MaxVertexNum];
void DFS(MGraph* p, int i)
{
int j;
visited[i] = 1;
printf("%d ", p->vex[i] );
for (j = 0; j < p->numVertexes; j++) {
if (!visited[j] && p->G[i][j] < MaxVertexNum && p->G[i][j] > 0)
DFS( p, j);
}
}
void DFSTraverse(MGraph* p)
{
int i;
for (i = 0; i < p->numVertexes; i++)
visited[i] = 0;
for (i = 0; i < p->numVertexes; i++) {
if (!visited[i])
DFS(p, i);
}
}
int EnQueue(LinkQueue* Q, int e)
{
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
if (!s)
exit(1);
s->data = e;
s->next = NULL;
Q->rear->next = s;
Q->rear = s;
return 1;
}
int DeQueue(LinkQueue* Q, int e)
{
QueuePtr p;
if (Q->front == Q->rear)
return 0;
p = Q->front->next;
e = p->data;
Q->front->next = p->next;
if (Q->rear == p)
Q->rear = Q->front;
free(p);
return e;
}
int QueueEmpty(LinkQueue* Q)
{
if (Q->front == Q->rear)
return 0;
return 1;
}
void BSFTraverse(MGraph* p)
{
int i, j;
LinkQueue* Q = (LinkQueue* )malloc(sizeof(LinkQueue ));
if (!Q) return;
Q->front = NULL;
Q->rear = NULL;
QueuePtr head = (QueuePtr)malloc(sizeof(QNode));
if (!head)
return ;
Q->rear = head;
Q->front = head;
for (i = 0; i < p->numVertexes; i++)
visited[i] = 0;
for (i = 0; i < p->numVertexes; i++) {
if (!visited[i]) {
visited[i] = 1;
printf("%d ", p->vex[i]);
EnQueue(Q, i);
while (!QueueEmpty(Q)) {
DeQueue(Q, i);
for (j = 0; j < p->numVertexes; j++) {
if (p->G[i][j] > 0 && p->G[i][j] < MAXSIZE && !visited[j]) {
visited[j] = 1;
printf("%d ", p->vex[j]);
EnQueue(Q, j);
}
}
}
}
}
}
int main()
{
int V0 = 0;
int P[MaxVertexNum];
int D[MaxVertexNum];
MGraph* p = CreateNode();
CreateGraph(p);
ShowGraph(p);
ShortestPath_Dijkstra(p, P, D, V0);
ShortestPath_Floyd(p);
printf("\n深度优先搜索\n");
DFSTraverse(p);
printf("\n广度优先搜索\n");
BSFTraverse(p);
printf("\n");
return 0;
}