Dijkstra_算法加入限制条件,如:首先从S点出发,终点是E,图中寻找最优路径,其中N2-N4,N13-N14为必走线段,N7,N12为不可走的点,
N12-N11为不可走的线段,要求在九个点之内,到达终点。
Dijkstra用到的存储结构:int dist[maxnum]; // 源节点到节点i的dist
prev[maxnum];//节点i的前节点 int c[maxnum][maxnum];//i 到 j 的距离
特殊点处理:
vector<int> path; //存放每一次的路径
vector<int> sp_nodes_p;//必经点、必经线段中的点存放
bool sp_edge[maxnum][maxnum];//必经线段[i][j]置位true
思路:
初始化;
对sp_nodes_p进行全排列,对每一种排列:
Dijkstra(n,st_node);//首先对源节点
cnt += dist[*it];//源节点到特殊节点列表中第一个节点的距离
path.push_back(*it);//第一个节点压入path容器
筛选出必经线段的两个点相邻的情况(遍历vector,若当前值和下一个迭代器false,再遍历其它所有节点若存在一个节点
为true,则跳出循环,不考虑此种排列)
1.必经线段处理:
将相反方向置位false。避免再次查找。
cnt += c[tmp][*it]; //直接加线段之间的直接距离。
path_p.push_back(tmp); //将线段两点压入临时容器 path_p中
path_p.push_back(*it);
2.不可经过线段处理:在查询之前,直接把c[a][b]置为maxnum
3.必经节点处理:
Dijkstra(n,tmp); //源节点为必经节点n
cnt += dist[*it];//原距离值+[n+1]位置节点的距离
将n到n+1期间的节点都存入//用栈
stack<int> q;
int tmp2=*it;
while(tmp2!=tmp)
{
q.push(tmp2);
tmp2=prev[tmp2];
}
while(q.empty()==0)
{
path_p.push_back(q.top());
q.pop();
}
比较每次的cnt,得到最短dist的情况,将路径打出;判断节点数是否满足。