带有限制条件的Dijkstra算法

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的情况,将路径打出;判断节点数是否满足。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值