题: (1 2)(1 3)(1 4)(1 6)(2 6)(3 4)(3 5)(4 7)(5 7)(5 8)(6 8)(7 8)
从1出发,到8的最短路径
#include<stdio.h>
#include<stdlib.h>
#define size 100 //矩阵大小
typedef struct Node
{
int city;
int pre;
Node *next;
}Node;
void jz(int m[size][size],int number)//构造邻接矩阵
{
int a,b;
printf("请输入道路,例如a b为a b之间有道路\n");
printf("输入0 0结束输入\n")
scanf("%d %d",&a,&b);
while(!(a==0&&b==0)) //有向图,可控制是有向图还是无向图
{
m[a][b]=1;
m[b][a]=1;
scanf("%d %d",&a,&b);
}
}
void No(Node &Dui)//创建队列
{
Dui.next=(Node *)malloc(size * sizeof(Node));
}
int search(int qh,int qe,Node &sq,int visited[],int m[size][size],int n,int chu,int zhong)//chu为开始城市 //zhong为终点城市
{
qh=chu-1;
qe=chu;
sq.next[chu].city=chu;
sq.next[chu].pre=0;
visited[chu]=1;
//当队不空
while(qh!=qe)
{
//结点出队
qh=qh+1; //初始城市为1
//加入结点
for(int i=1;i<=n;i++)
{
if(m[sq.next[qh].city][i]==1&&visited[i]==0)
{
// 结点入队
qe=qe+1;
sq.next[qe].city=i;
sq.next[qe].pre=qh;
visited[i]=1;
}
if(sq.next[qe].city==zhong)//是否找到城市8
{
printf("路径为(倒序路径):\n");
printf("%d",sq.next[qe].city);
while(sq.next[qe].pre>0)
{
qe=sq.next[qe].pre;
printf("--%d",sq.next[qe].city);
}
return 0;
}
}
}
}
int main()
{
int qh;//队首下标
int qe;//队尾下标
int m[size][size];
printf("输入顶点数量\n");
int number;
scanf("%d",&number);
printf("输入开始城市,和终点城市\n");
int chu,zhong;
scanf("%d %d",&chu,&zhong);
jz(m,number);
Node Dui;
No(Dui);
int visited[size];
search(qh,qe,Dui,visited,m,number,chu,zhong);//查找最短路径
return 0;
}