Dijkstra 算法不仅是求图中最短路径的O(N²)算法
在关于图的动态规划中可以将题目转换为图,再用该算法进行DP
代码如下
#include<iostream> // made by Huing
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int c[10001],f[1001][1001],n,m,s,t;
bool exist[10001],b[10001];
void Dijkstra(int s)
{
memset(b,false,sizeof(b));
b[s]=true;
c[s]=0;
for (int i=1;i<=n;i++) c[i]=f[s][i];//初始化
for (int i=1;i<+n-1;i++)
{
int k=0,minl=1e30;
for (int j=1;j<=n;j++)
if(!b[j]&&c[j]<minl){
k=j;minl=c[j];
}
if(k==0) break;
b[k]=true;
for (int j=1;j<=n;j++)
c[j]=min(c[j],c[k]+f[k][j]);
}
cout<<c[t];
}
int main()
{
cin>>n>>s>>t; //求s到t的最短路径
memset(f,-0x7fffffff/3,sizeof(f));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
cin>>f[i][j];
Dijkstra(s);
}