实现原理其实就是动态规划 !!!
迪杰斯特拉实现原理是贪心,弗洛伊德实现原理就是动态规划。
例题:
#include <bits/stdc++.h>
using namespace std;
const int N=210,INF=1e9;
int dist[N][N];
//初始化数组
void init(int n){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) dist[i][j]=0;
else dist[i][j]=INF;
}
void Floyd(int n){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dist[i][j]=min(dist[i][k]+dist[k][j],dist[i][j]);
}
}
int main(){
int n,m,k,q;
int x,y,z;
cin>>n>>m>>q;
init(n); //初始化数组
//输入边长
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
dist[x][y]=min(dist[x][y],z); //保存最小重边
}
Floyd(n); //调用算法
//开始询问
while(q--){
cin>>x>>y;
//dist[x][y]==INF可能会有问题,因为存在一些负无穷边
if(dist[x][y]>INF/2) cout<<"impossible"<<endl;
else cout<<dist[x][y]<<endl;
}
return 0;
}