我们都知道DFS可以求解没有权值(即两点之间的距离是1)的图中两点的最短距离,但是DFS还可以求解含权值的两点的距离最小值
例子
输入:
5 8(n m 分别是点、边的个数)
1 5(s e 分别是起点与终点)
1 2 2(接下来是8条边的点、权值)
1 5 10
2 3 3
2 5 7
3 1 4
3 4 4
4 5 5
5 3 3
代码
#include<iostream> #include<algorithm> using namespace std; int visited[200]; int n, m,s,e; int edges[200][200]; #define inf 0x3f3f3f3f int mins = inf; void dfs(int cru,int dis) { if (dis > mins)return; if (cru == e) { if (dis < mins)mins = dis; return; } for (int j = 1; j <= n; j++) { if (edges[cru][j] != inf&&!visited[j]) { visited[j] = 1; dfs(j, dis + edges[cru][j]); visited[j] = 0; } } return; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0); cin >> n >> m; cin >> s >> e; fill(edges[0], edges[0] + 200 * 200, inf); for (int i = 0; i < m; i++) { int a, b,c; cin >> a >> b>>c; edges[a][b] = c; } visited[s] = 1; dfs(s, 0); cout << mins; } //5 8 //1 5 //1 2 2 //1 5 10 //2 3 3 //2 5 7 //3 1 4 //3 4 4 //4 5 5 //5 3 3
参考:《啊哈算法》书籍