/*
图(有向有权图)
2018.12.16 初步完成
2018.12.18 加入文件操作
*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define INF 1000
int visit[MAXSIZE];//【深度/广度优先遍历使用】全局数组,存放元素访问标记,访问为1,未访问为0
int dist[MAXSIZE];//【单源最短路径使用】从源结点到每个结点的最短路径的长度
int path[MAXSIZE];//【单源最短路径使用】保存path[vi]从v0到vi最短路径上vi的前一个结点
//【边--链表存储】定义 边 ------存储边的数据结构是 链表
typedef struct EdgeNode
{
int adjacentVertex;//该边指向的结点位置(下一个节点),相当于指是记录指向的结点的下标 adjacent vertex 临接结点
int weight;//定义边的权值
struct EdgeNode *nextEdge;//指向下一条边的指针
}EdgeNode;
//【顶点--数组存储】定义 顶点 -------存储顶点的数据结构是 数组
typedef struct VertexNode
{
char data;//顶点信息
EdgeNode *firstEdge;//指向第一条边的指针
}VertexNode;
//定义 图
typedef struct
{
VertexNode adjacentList[MAXSIZE];//【邻接链表表头数组】[是一个结构体数组](每个元素都含有 顶点信息 和 指向第一条边的指针)
int vertexNumber;//顶点数
int edgeNumber;//边数
int edgeWeight[MAXSIZE][MAXSIZE];//【有向有权图-邻接矩阵】两顶点的权值(有向有权图),无法直接到达设为INF
}Graph;
//置0一个一维数组
void setZero(int *visit)
{
for (int i = 0; i < MAXSIZE; i++)
{
visit[i] = 0;
}
return;
}
//链表建立方式为 头插法
void createGraphF(Graph *g)
{
//初始化图的 顶点数 边数
int vertexNumber;
int edgeNumber;
printf("请输入要建立的图的 顶点数 边数:");
scanf("%d %d", &vertexNumber, &edgeNumber);
g->vertexNumber = vertexNumber;
g->edgeNumber = edgeNumber; //图的顶点数和边数初始化完毕
//初始化图的 权重数组 全部赋值为INF
for (int i = 0; i < g->vertexNumber; i++)
for (int j = 0; j < g->vertexNumber; j++)
{
g->edgeWeight[i][j] = INF;
}
//建立了只有顶点的图
for(int i =0;i<vertexNumber;i++)
{
g->adjacentList[i].data = i;
g->adjacentList[i].firstEdge = NULL;
}
EdgeNode *newNode;//用来临时存放边结点
//插入边--边的开始 结束/边的权值
for (int i = 0; i < g->edgeNumber; i++)
{
//插入边和权值
int startSubscript;//前驱结点的下标
int endSubscript;//后继结点的下表
int weight;//边的权重
scanf("%d %d %d", &startSubscript, &endSubscript,