5.0 图与遍历搜索图
图的简介与二维数组
图就是由顶点和连接顶点的边组成的
表示图
我们利用二维数组表示图
二维数组的两个参数行列,均表示顶点,二者相交得到的即是距离
我们用正无穷(一般可以用999999代替)表示二者之间没有边,0是某点到自身的距离
比如e[a][b] = 3 ;就代表a到b的距离是3
图还分为有向图和无向图
顾名思义,有向图是有方向属性的,无向图则没有
换言之,对于无向图,我们有:
e[a][b] = e[b][a]
图的遍历
我们上一章学习了深度优先算法和广度优先算法
现在我们就利用它们来完成图的遍历
我们还是以一个例子来说吧
例题
假设我们在一个道路具有单向型的地方行走,我们想得到两点之间的路径和距离
1->5 10
1->2 2
2->5 7
2->3 3
3->1 3
3->4 4
4->5 5
5->3 3
现在,我们想要从1到达5的最短路径
#include <stdio.h>
int min =9999999 ; //预设距离最小值
int book[101] ; //标记数组
int e[101][101] ; //图
int n ;//目标城市
//先写一个DFS方法
void dfs(int cur,int dis){
int j ;
//如果走过的路程已经大于了最短路径,那就直接返回,因为不可能是最短路径
if(dis>min) return ; //其实这一步也让99999999代表正无穷成立
if(cur == n)
{
//如果到达了目标城市
if(dis<min) min = dfs ; //更新最小值
return ;
}
for(j=1;j<=n;j++)
{
//判断路径
if(e[cut][j] != 9999999 && book[j] = 0)
{
book[j] = 1 ; //mark
dfs(j,dis+e[cur][j]) ; //继续搜寻
book[j] = 0 ;//之后递归回来的时候清掉标记
}
}
return ;
}
int main()
{
int i,j,m,a,b,c;
scanf("%d %d",&n,&m);
//初始化二维矩阵
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i==j)
e[i][j] = 0;
else
e[i][j] = 9999999 ;
//读入城市之间的道路
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&a,&b,&c);
e[a][b] = c ;
}
//从1号城市出发
book[1] = 1 ;
dfs(1,0) ; //1是当前城市编号,0是走过的路程
printf("%d",min) ;
getchar();getchar();
return 0 ;
}