一共两个知识点:
1、通过线性数组维护有向/无向图
2、通过队列维护分层的bfs遍历
//线性表存储图 + 队列实现的分层bfs算法
class Solution {
public:
class stu{
public://当前节点的配对节点、下一个节点的cnt编号、线路权值
int vertex,next,value;
stu(){};
stu(int a,int b,int c):vertex(a),next(b),value(c){};
};
//两个数组+一个编号变量维护一张图
stu mapper[4000];
int cnt;
int head[101];
//用来添加一条路径u->v且权值为w
void add(int u,int v,int w)
{
mapper[cnt] = stu(v,head[u],w);
head[u] = cnt++;
}
//注意初始化特点
void init(int n)
{
cnt = 0;
memset(head,-1,sizeof(head));
}
//将题目给出的vector信息用一维数组维护
void TransToMapper(vector<vector<int> >& flights,int n)
{
init(n);//初始化
for(vector<int>& rhs : flights) add(rhs[0],rhs[1],rhs[2]);
}
//描述队列中当前节点的状态的变量
class statu{
public://当前节点、截止到当前节点的积累权值和
int vertex,sum;
statu(int a,int b):vertex(a),sum(b){};
};
//解决问题的函数
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int K)
{
//转换成为线性地图
TransToMapper(flights,n);
//bfs层次遍历
queue<statu> que;
que.push(statu(src,0));
int step = 0;
int ans = 0x3f3f3f3f;
while(!que.empty() && step<= K)
{
//对于每一个层次而言
//用长度描述其在队列中的所在位置
int lenth = que.size();
//然后每一层次对应每一次循环
while(lenth--)
{
statu psd = que.front();
que.pop();
int u = psd.vertex;
int cursum = psd.sum;
//注意下面如何使用一维数组维护下的图
for(int i=head[u];~i;i=mapper[i].next)
{
int v = mapper[i].vertex;
int nextsum = mapper[i].value + cursum;
if(nextsum >= ans)continue;
else if(v == dst)ans = min(ans,nextsum);
else que.push(statu(v,nextsum));
}
}
//一个层次访问完毕就step+1
step++;
}
return ans == 0x3f3f3f3f ? -1 : ans ;
}
};
OK