动态规划
#define MAXN 0x7ffffff
#define MIN(x,y) (x<y?x:y)
int findCheapestPrice(int n, int** flights, int flightsSize, int* flightsColSize, int src, int dst, int k){
int martrix[n][n];
int dis0[n];//存储src到各个点经过k-1次中转的距离
int dis1[n];//存储src到各个点经过k次中转的距离
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
martrix[i][j]=MAXN;
}
}
for(int i=0;i<flightsSize;i++)
{
martrix[flights[i][0]][flights[i][1]]=flights[i][2];
}
//初始化dis0数组
for(int i=0;i<n;i++)
{
dis0[i]=martrix[src][i];
}
int minn=MAXN;
for(int t=0;t<=k;t++)
{
//考察t中转次数时src到dst的最短距离, 初始时中转次数是0
if(dis0[dst]!=MAXN)
minn=MIN(minn,dis0[dst]);
if(t==k)
break;
//通过dis0数组,生成dis1数组,即中转次数+1时的距离
for(int i=0;i<n;i++)
{
dis1[i]=MAXN;
}
for(int i=0;i<n;i++)
{
if(i!=src)
{
for(int j=0;j<n;j++)
{
if(dis0[j]!=MAXN&&martrix[j][i]!=MAXN)
{
dis1[i]=MIN(dis1[i],dis0[j]+martrix[j][i]);
}
}
}
}
//改为dis0数组
for(int i=0;i<n;i++)
{
dis0[i]=dis1[i];
}
}
if(minn==MAXN)
return -1;
return minn;
}
Bellman-Ford