Djistra算法
输入的权值不能为负。
C语言实现:
算法外部有所改动,核心算法没有改。
声明:
代码在:code::blocks上编译通过。其他的没有试过。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 20
#define TRUE 1
#define FALSE 0
#define INTMAX 0xFFFF
#define OK 1
#define ERROR 0
typedef char Type[MAX_LEN];
int visit[MAX_LEN];
typedef struct ArcNode{///-------邻接表节点
int adjvex;
int weight;
struct ArcNode * next;
}ArcNode;
typedef struct VNode{///--------邻接表头
Type data;
int dist;
int len;
int path[MAX_LEN];
ArcNode * firstarc;
}VNode , AdjList[MAX_LEN];
typedef struct ALGraph{///----图
AdjList vertices;
int vexnum;
int arcnum;
//int kind;
}ALGraph;
typedef struct Node{///---------广度优先遍历----链表实现
Type CH;
int x;
struct Node * next;
}Node;
void InitGraph( ALGraph * g )///---------------初始化函数--------------------
{
int i ;
printf("请输入 顶点数 和 边数:\n");
scanf("%d %d",&g->vexnum , &g->arcnum);
printf("请输入 顶点信息 :\n");
for( i = 0 ; i < g->vexnum ; i ++){
scanf("%s",&g->vertices[i].data);
g->vertices[i].firstarc = NULL;
}
}
int LocateVex( ALGraph * g , Type v )///-----------------查找函数----------------
{
int i;
for( i = 0 ; i < g->vexnum ; i++){
if( (strcmp(v , g->vertices[i].data)) == 0 )
return i;
}
}
void CreateAdjList( ALGraph * g )///----------------------邻接表建立有向图函数--------------
{
int i , j , k , weight;
Type v1 , v2 ;
ArcNode * p ;
printf("请输入%d条弧的 两两关系 及 权重 :\n",g->arcnum);
for( k = 0 ; k < g->arcnum ; k ++)
{
scanf("%s %s %d",&v1 , &v2 , &weight);
i = LocateVex( g , v1 );
j = LocateVex( g , v2 );
ArcNode * newnode = ( ArcNode * )malloc(sizeof(ArcNode));
newnode->adjvex = j;
newnode->weight = weight;
newnode->next = NULL;
p = g->vertices[i].firstarc;
if( p == NULL ){
g->vertices[i].firstarc = newnode;
}
else{