#include <stdio.h>
#include <string.h>
#define INFINITY 1000
#define MAX_VERTEX_NUM 20
typedef enum{DG,DN,UDG,UDN} Graphkind;
typedef struct ArcCell{
int adj;
char *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
char vexs[MAX_VERTEX_NUM][4];
AdjMatrix arcs;
int vexnum,arcnum;
Graphkind kind;
}MGraph;
int visited[MAX_VERTEX_NUM];
void CreateGraph(MGraph *G);
void CreateDG(MGraph *G);
void CreateDN(MGraph *G);
void CreateUDG(MGraph *G);
void CreateUDN(MGraph *G);
int LocateVex(MGraph *G,char v[4]);
void Girst_next_adj(MGraph *G,int i);
void dfs1(MGraph *G,int i);
void bfs1(MGraph *G,int i);
void shortesPath_DIJ(MGraph *G,int v0,int p[][MAX_VERTEX_NUM],int d[MAX_VERTEX_NUM]);
#define QUEUE_INIT_SIZE 100
#define QUEUEINCREMENT 10
typedef int QElemType;
typedef struct{
QElemType *elem;
int front;
int rear;
int queuesize;
int incrementsize;
}SqQueue;
void InitQueue_sq(SqQueue *Q,int n);
int QueueLength_Sq(SqQueue Q);
int DeQueue_Sq(SqQueue *Q,QElemType *e);
void incrementQueuesize(SqQueue *Q);
void EnQueue_Sq(SqQueue *Q,QElemType e);
int GetQueue_Sq(SqQueue Q,QElemType *e);
int QueueEmpty(SqQueue Q);
main(){
MGraph G;
int i,j;
char v[4];
int p[MAX_VERTEX_NUM][MAX_VERTEX_NUM],d[MAX_VERTEX_NUM];
CreateGraph(&G);
for(i=0;i<G.vexnum;++i)
{
for(j=0;j<G.vexnum;++j)
printf("%8d",G.arcs[i][j].adj);
putchar('\n');
}
printf("输入深度优先搜索初始顶点Vi: ");
getchar();
scanf("%s",v);
i=LocateVex(&G,v);
dfs1(&G,i);
printf("\n输入出发广度优先搜索初始顶点: ");
getchar();
scanf("%s",v);
i=LocateVex(&G,v);
bfs1(&G,v);
bfs1(&G,i);
if(G->kind==DN||G->kind=UDN)
{
printf("\n输入查找第一邻接点的顶点: ");
getchar();
scanf("%s",v);
i=LocateVex(&G,v);
shortesPath_DIJ(&G,0,p,d);
}
}
int visited[MAX_VERTEX_NUM];
void dfs1(MGraph *G,int i)
{
int j;
printf("%5s",G->vexs[i]);
visited[i]=1;
for(j=0;j<G->vexnum;j++)
if(i!=j&&G->arcs[i][j].adj!=INFINITY&&!visited[j])
dfs1(G,j);
}
void bfs1(MGraph *G,int i)
{
int k,j;
SqQueue Q;
for(j=0;j<G->vexnum;j++)
visited[j]=0;
InitQueue_Sq(&Q,G->vexnum);
printf("\n%5s",G->vexs[i]);
visited[i]=1;
EnQueue_Sq(&Q,i);
while(!QueueEmpty(Q))
{
DeQueue_Sq(&Q,&k);
for(j=0;j<G->vexnum;j++)
{
if(k!j&&G->arcs[k][j].adj!=INFINITY&&!visited[j])
{
printf("%5s",G->vexs[j]);
visited[j]=1;
EnQueue_Sq(&Q,j);
}
}
}
}
int LocateVex(MGraph *G,char v[4])
{
int i=0;
while(i<G->vexnum)
{
if(strcmp(G->vexs[i],v)==0) return i;
i++;
}
printf("\n输入的顶点不存在!");
return 0;
}
void CreateDG(MGraph *G)
{}
void CreateDN(MGraph *G)
{
int i,j,k,w;
char v1[4],v2[4];
printf("输入DN--vexnum,arcnum:");
scanf("%d%d",&G-<vexnum,&G->arcnum);
printf("输入vexs[i]:\n");
getchar();
for(i=0;i<G->vexnum;++i)
gets(G->vexs[i]);
for(i=0;i<G->vexnum;++i)
switch(k)
{
case 0:G->kind=DG; break;
case 1:G->kind=DN; break;
case 2:G->kind=UDG; break;
case 3:G->kind=UDN; break;
}
switch(G->kind)
{
case DG:CreateDG(G); break;
case DN:CreateDN(G); break;
case UDG:CreateUDG(G); break;
case UDN:CreateUDN(G); break;
}
printf("ok!\n");
}
void First_next_adj(MGraph *G,int i)
{
int j;
for(j=0;j<G->arcs[i][j].adj!=INFINITY)
if(G->arcs[i][j].adj!=INFINITY)
printf("%s\n",G->vexs[j]);
}
void shortesPath_DIJ(MGraph *G,int v0,intp[][MAX_VERTEX_NUM],int d[MAX_VERTEX_NUM]){
int i,j,v,min,w,final[MAX_VERTEX_NUM],v1,w1;
for(v=0;v<g->vexnum;++v){
final[v]=0;
d[v]=G->arcs[v0][v].adj;
for(w=0;w<G->vexnum;++w)
p[v][w]=0;
if(d[v]<INFINITY){
p[v][v0]=1;p[v][v]=1;
}
}
printf("\nfinal[]:");
for(v1=0;v1<G->vexnum;++v1)
printf("%6d",final[v1]);
printf("\n\n d[]: ");
for(v1=0;v1<G->vexnum;++v1)
printf("%6d",d[v1]);
printf("\n\np[][]:\n");
for(v1=0;v1<G->vexnum;++v1){
for(w1=0;w1<G->vexnum;++w1)
printf("%6d",p[v1][w1]);
putchar('\n');
}
d[v0]=0;final[v0]=1;
for(i=1;i<G->vexnum;++i){
min=INFINITY;
for(w=0;w<G->vexnum;++w)
if(!final[w])
if(d[w]<min){
v=w;
min=d[w];
}
final[v]=1;
for(w=0;w<G->vexnum;++w)
if(!final[w]&&(min+G->arcs[v][w].adj<d[w])){
d[w]=min+G->arcs[v][w].adj;
for(j=0;j<G->vexnum;++j)
p[w][j]=p[v][j];
q[w][w]=1;
}
printf("\nfinal[]:");
for(v1=0;v1<G->vexnum;++v1)
printf("%6d",final[v1];
printf("\n\n d[]: ");
for(v1=0;v1<G->vexnum;++v1)
printf("%6d",d[v1]);
printf("\n\np[][]:\n");
for(v1=0;v1<G->vexnum;++v1){
for(w1=0;w1<G->vexnum;++w1)
printf"%6d",p[v1][w1]);
putchar('\n');
}
}
}
分享到:
相关推荐
在计算机科学领域,多段图最短路径问题是一个经典的图论问题,主要研究如何在具有多个边段的图中寻找从源节点到目标节点的最短路径。这个问题在实际应用中有着广泛的需求,例如在交通网络规划、物流配送、网络路由...
在计算机科学和图论中,"多段图的最短路径问题"是一个经典的问题,它涉及到寻找在具有多个阶段或段的图中从一个源节点到一个目标节点的最经济路径。多段图通常用于模拟复杂的网络,如交通网络、通信网络或者任务调度...
有向图最短路径是图论中的一个经典问题,它在计算机科学,特别是算法和数据结构领域具有重要的应用。在给定的标题和描述中,我们可以看出这是一个使用C++面向对象编程实现的程序,用于解决有向图中最短路径的问题。...
最短路径问题可以被定义为:在带权无向图或有向图中寻找两个特定节点间路径的最小代价。在这个硅谷城镇地图问题中,我们可以假设图是有向的,因为通常交通网络都是单向的。权值可能代表距离、行驶时间或者其它相关的...
#include //#define LEN sizeof(struct NODE) #define N 10 #define MAX_TYPE 10000 #define ZERO_TYPE 0 /*定义图的邻接链表*/ struct NODE /*邻接表.../*在阶段决策中,各个顶点到收点的最短路径上的前方顶点编号*/
最短路径问题通常涉及到在一个加权图中寻找从一个源节点到其他所有节点的最短路径。这里我们将探讨几种常见的最短路径算法,并且会提及如何用C#来实现它们。 1. **Dijkstra算法**:由艾兹格·迪科斯彻提出的...
3. Floyd-Warshall算法:Floyd-Warshall算法是一种解决所有对最短路径的全局算法,适合于计算稠密图中的最短路径。它通过填充一个距离矩阵,逐步考虑所有可能的中间节点,最终得到所有节点对之间的最短路径。时间...
Floyd-Warshall则适用于所有类型的图,通过动态规划方法找出所有节点对之间的最短路径;A*搜索算法在Dijkstra的基础上加入了启发式信息,提高了寻找最短路径的效率,尤其适合处理大规模问题。 在AE中最短路径分析的...
图可以表示节点(顶点)和它们之间的关系(边),这对于寻找两点间的最短路径至关重要。 3. **最短路径算法**:在图论中,最短路径问题寻找的是两个节点间经过最少边的路径。常见的算法有Dijkstra算法和Floyd-...
在计算机科学中,求解图的最短路径问题是一个经典且重要的问题,广泛应用于网络路由、交通规划等领域。本文将详细讲解如何使用邻接矩阵或邻接表来存储有向图,并探讨解决从一个顶点到其他所有顶点最短路径的算法。 ...
"图的最短路径、拓扑排序和关键路径" 图的最短路径是图论中的一种重要概念,它是指从图的一顶点到另一顶点的路径中,所经过的边的数目最少的那条路径。这种路径也可以称作最短距离或最短路径长度。在无权图中,图的...
最短路径问题是一个经典的问题,寻找无向图中的最短路径有着广泛的应用,比如路由选择、网络优化等。本项目以Java语言实现了求解无向图所有最短路径的算法。 1. **Dijkstra算法** Dijkstra算法是最常用的单源最短...
本主题关注的是多段图的最短路径问题,通过动态规划法来求解。动态规划是一种利用子问题的最优解来构建全局最优解的算法设计策略,适用于解决具有重叠子问题和最优子结构的问题。 多段图是指一个图中的边不再仅连接...
1. 问题描述:求网(带权有向图)中从一个顶点到其余各顶点间的最短路径。 2. 实验原理:贪心算法原理。 3. 实验内容:使用贪心算法解决单源最短路径问题,并通过本例熟悉贪心算法在程序设计中的应用方法。 4. 实验...
### 时态图最短路径查询方法 #### 引言 随着信息技术的发展,图论作为数据结构中的一个重要分支,被广泛应用于多个领域之中。而针对图的最短路径查询问题,一直是研究的重点之一。传统的图模型往往忽略了时间因素...
【单源最短路径】是图论中的一个重要概念,它是指在给定的带权有向图中,从一个特定的源节点出发,找到到达所有其他节点的最短路径。这个概念广泛应用于计算机科学和算法设计,特别是在网络路由、物流规划、社交网络...
单源点最短路径问题是图论中的一个基本问题,它是指从图中的一个源点到所有其他点的最短路径。贪心算法是一种常用的解决此类问题的方法。本文将介绍使用贪心算法实现单源点最短路径问题的 C 语言实现。 单源点最短...
1. 迪杰斯特拉算法:适用于无权边或非负权重的有向图,从一个起点开始,逐步扩展最短路径,直到找到所有顶点的最短路径。它使用优先队列(通常用堆实现)来维护待处理的顶点,每次选取距离起点最近的未处理顶点进行...
最短路径算法是图论中的一个经典问题,用于寻找图中两点之间最短的路径。Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出的一种解决这一问题的有效方法。本篇文章将深入探讨Dijkstra算法的基本原理、...
在计算机科学中,寻找网络图中的最短路径是一个常见的问题,尤其在路由、交通规划、社交网络等领域有广泛应用。本文将深入探讨如何使用C++编程语言实现这一算法,并结合提供的压缩包文件,来理解最短路径算法的核心...