问题描述:
有向图如下:
求节点1到节点5的最短路径?
代码
// DFS_test.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<stdio.h>
#define MAXVEX 100
#define MAXDATA 10000000
typedef struct
{
int vertexs[MAXVEX];
int edges[MAXVEX][MAXVEX];
int numVertexs;
int numEdges;
int max_path;
}MGraph;
// book:顶点遍历标志位
int min=999999999,book[101];
void dfs2(MGraph & m,int cur,int dis)
{
int j;
// 走过的路程大于最短路径,所以可以确定当前路径不是最优的,无意义,所以返回
if(dis>min)
{
return;
}
//判断是否到达了目标顶点
if(cur==m.numVertexs)
{
if(dis<min) min = dis;
return;
}
for(j=1;j<=m.numVertexs;j++)
{
//1.该条边有效
//2.该顶点没有被访问过
if(m.edges[cur][j]!=99999999&&book[j]==0)
{
//e[cur][j]:到下一个顶点的路程
book[j]=1;
dfs2(m,j,dis+m.edges[cur][j]);
book[j]=0; //注意这里!!
}
}
return;
}
int main()
{
int i,j,a,b,c;
MGraph m;
scanf("%d %d",&m.numVertexs,&m.numEdges);
for(i=1;i<=m.numVertexs;i++)
{
for(j=1;j<=m.numVertexs;j++)
{
if(i==j)
{
m.edges[i][j]=0;
}
else
{
m.edges[i][j]=MAXDATA;
}
}
}
for(i=1;i<=m.numEdges;i++) //边
{
scanf("%d %d %d",&a,&b,&c);
m.edges[a][b] = c;
}
book[1]=1;
//初始顶点为1顶点
dfs2(m,1,0);
printf("%d",min);
getchar();
return 0;
}
输入参数:
5 8
1 2 2
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3
输出:
9