邻接矩阵表示法创建的有向网,并将该网的顶点表和邻接矩阵进行存盘读盘处理,最后用迪杰斯特拉算法求该有向网任意两结点的最短路径
我现在是大一刚刚结束,这个小项目是我们这学期数据结构的实训任务之一,如有不足,望大家指正。一学期的网课结束了,但感觉学习数据结构这门专业课挺无聊挺吃力的,感觉网课让我懈怠了不少,接下来我会不断的写博客,关于C语言程序设计基础,和数据结构的相关要点讲解和知识点,希望在这个暑假可以和大家共同进步。卑微求赞,求赞,求赞…
其中存盘读盘的文件路径根据个人进行修改。
#include <iostream>
using namespace std;
#include <cstdio>
#include <fstream>
#include<cstring>
#include<cstdlib>
#include<string>
#define MVNum 100
#define MaxInt 32767
#define error 0
#define OK 1
typedef char VerTexType;
typedef int ArcType;
typedef int status;
typedef struct
{
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
}AMGraph;
int LocateVex(AMGraph G, VerTexType x)/*求顶点位置函数*/
{
int j = error, k;
for (k = 0; k<G.vexnum; k++)
if (G.vexs[k] == x)
{
j = k;
break;
}
return(j);
}
status CreateUDN(AMGraph &G)
{
void Cunpan(AMGraph G);
int i, j, k, w;
VerTexType v1, v2;
printf("请输入有向网的总顶点数和总边数(用空格隔开):\n");
cin >> G.vexnum >> G.arcnum;
printf("依次输入顶点的名称(如a):\n");
for (i = 0; i<G.vexnum; ++i)
{
printf("请依次输入第%d个顶点:", i + 1);
cin >> G.vexs[i];
}
for (i = 0; i<G.vexnum; ++i)
{
for (j = 0; j<G.vexnum; ++j)
G.arcs[i][j] = MaxInt;
}
printf("请输入各条边依附的顶点及权值(如a b 5)其中a为弧尾:\n");
for (k = 0; k<G.arcnum; ++k)
{
printf("请输入第%d条边依附的顶点及权值:", k + 1);
cin >> v1 >> v2 >> w;
i = LocateVex(G, v1); j = LocateVex(G, v2);
G.arcs[i][j] = w;
}
Cunpan( G );
return OK;
}
void Cunpan(AMGraph G)
{
int i, j;
ofstream outFile;
// 打开文件。 下面路径根据自己情况做修改。
outFile.open("D:\\GGtestC\\data.txt");
for (i = 0; i<G.vexnum; i++) //写入数据
{
outFile << G.vexs[i];
if (i == G.vexnum-1)
outFile << endl;
}
//AMGraph G;
for (i = 0; i<G.vexnum; ++i)
{
for (j = 0; j<G.vexnum; ++j)
{
if (G.arcs[i][j] != MaxInt)
outFile << G.arcs[i][j];
else
outFile << "∞";
}
outFile << endl;
}
outFile.close(); //关闭文件
}
void Dupan()
{
ifstream infile("D:\\GGtestC\\data.txt", ios::in);
if(!infile.fail())
{
while(!infile.eof())
{
string str5;
infile>>str5;
cout<<str5<<endl;
}
}
infile.close();
}
void ShortestPath_DIJ(AMGraph G , int v0)
{
int n,v,w,i,min,q;
int s[100],d[100],path[100];
n=G.vexnum;
for(v=0;v<n;++v)
{
s[v]=false;
d[v]=G.arcs[v0][v];
if(d[v]<MaxInt) path[v]=v0;
else path[v]=-1;
}
s[v0]=true;
d[v0]=0;
for(i=1;i<n;++i)
{
min=MaxInt;
for(w=0;w<n;++w)
if(!s[w]&&d[w]<min)
{v=w;min=d[w];}
s[v]=true;
for(w=0;w<n;++w)
if(!s[w]&&(d[v]+G.arcs[v][w]<d[w]))
{
d[w]=d[v]+G.arcs[v][w];
path[w]=v;
}
}
printf("请输入想要求最短路径终点的下标:");
scanf("%d",&q);
printf("\n该最短路径为:%d\n\n",d[q]);
printf("具体路径如下:");
printf("%c",G.vexs[q]);
q=path[q];
while(path[q]!=-1)
{
printf("<--%c",G.vexs[q]);
q=path[q];
}
printf("<--%c",G.vexs[q]);
}
int main()
{
printf("**************邻接矩阵表示法创建的有向网**************\n");
int i, j,v0;
AMGraph G;
CreateUDN(G);
for (i = 0; i<G.vexnum; ++i)
{
for (j = 0; j<G.vexnum; ++j)
{
if (G.arcs[i][j] != MaxInt)
cout << G.arcs[i][j] << "\t";
else
cout << "∞" << "\t";
}
cout << endl << endl;
}
cout << endl;
int a;
printf("是否需要读盘(1 or 0):");
scanf("%d",&a);
if(a)
{
Dupan();
}
printf("\n***************迪杰斯特拉算法求最短路径*************\n");
printf("顶点名称:");
for(i=0;i<G.vexnum;i++)
{
printf("%c ",G.vexs[i]);
}printf("\n");
printf("顶点下标:");
for(i=0;i<G.vexnum;i++)
{
printf("%d ",i);
}printf("\n");
printf("请输入起始顶点的下标:");
scanf("%d",&v0);
ShortestPath_DIJ( G,v0);
return 0;
}
运行结果如下:
输入下图有向网
输入该网的数据
存盘读盘效果,左为读盘,右为存盘
迪杰斯特拉求最短路径