[ACM] 最短路-动态规划的实现

这次用一个特殊的写法,用动态规划来实现最短路,同样的方法也可以完成最长路,只要把min改成max, 把dp[i]的默认值设置为负数即可,我这里采用的是记忆化搜索,比较容易理解,这里的dp[i]里面存的点i距离起点的最短距离,所以每一个dp[i]都等于与它相邻的点的dp值+1后的最小的那一个,而vis数组则是用来标注某个点是否被计算过或者访问过,然后看下代码应该就可以懂了

#include <iostream>
#include <algorithm>
#define MAXN 1000
using namespace std;
int dp[MAXN];
int line[MAXN][MAXN];
bool vis[MAXN];
int n;

int solve(int,int);
int main() {
    int p;
    while(cin>>n>>p){
        for(int i=0;i<p;i++){
            int a,b;
            cin>>a>>b;
            line[a][b]=true;
            line[b][a]=true;
        }
        cout<<solve(3,2);
    }
    return 0;
}

int solve(int s,int i){
    if(vis[i])return dp[i];
    else if(i==s) return 0;
    else{
        vis[i]=true;
        dp[i]=10000000;
        for(int j=1;j<=n;j++){
            if(!line[i][j]||vis[j])continue;
            dp[i]=min(solve(s,j)+1,dp[i]);
        }
        return dp[i];
    }
}
    原文作者:tommy990607
    原文地址: https://www.jianshu.com/p/5f6a841560ec
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞