思路:
Dijskra,但是不能有vis数组,同时,如果更新的点虽然路径更长但是换乘更少也要入队。
个人认为,能够独立做出这题的,那么对于这个算法并不是停留在背模板的阶段了。
class Solution {
public:
#define inf 0x3f3f3f3f
struct node
{
int to,len,num;
node(){};
node(int x,int y,int z)
{
to=x,len=y,num=z;
}
bool operator <(const node& x)const {
if(x.len==len)return x.num<num;
return x.len < len;
}
};
vector<node>ve[100005];
priority_queue<node>que;
int stop[100005];
int dis[100005];
map<int,int>vis;
int dij(int n,int k,int src,int dst)
{
for(int i=0;i<n;i++)
{
stop[i]=1;
dis[i]=inf;
}
k+=2;
dis[src]=0;
que.push(node(src,0,1));
int minn=inf;
while (!que.empty())
{
node p=que.top();
que.pop();
if(p.to==dst)
{
return p.len;
}
if(p.num<k)
{
for(int i=0;i<ve[p.to].size();i++)
{
if (p.len+ve[p.to][i].len<dis[ve[p.to][i].to])
{
dis[ve[p.to][i].to]=p.len+ve[p.to][i].len;
stop[ve[p.to][i].to]=p.num+1;
que.push(node(ve[p.to][i].to,dis[ve[p.to][i].to],p.num+1));
}
else if(p.num+1<stop[ve[p.to][i].to])
{
que.push(node(ve[p.to][i].to,p.len+ve[p.to][i].len,p.num+1));
}
}
}
}
if(minn==inf)return -1;
else return minn;
}
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
for(int i=0;i<flights.size();i++)
{
ve[flights[i][0]].push_back(node(flights[i][1],flights[i][2],1));
}
return dij(n,k,src,dst);
}
};