这次用一个特殊的写法,用动态规划来实现最短路,同样的方法也可以完成最长路,只要把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];
}
}