<div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><b>[cpp]</b> <a href="#" class="ViewSource" title="view plain" οnclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span class="tracking-ad" data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" οnclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" target="_blank">copy</a><div style="position: absolute; left: 665px; top: 1610px; width: 23px; height: 12px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="23" height="12" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=23&height=12" wmode="transparent"></div></span><span class="tracking-ad" data-mod="popu_169"> <a href="#" class="PrintSource" title="print" οnclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" target="_blank">print</a></span><a href="#" class="About" title="?" οnclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/1600264" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/1600264/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-cpp"><li class="alt"><span><span class="preprocessor">#pragma once</span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <iostream></span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <queue></span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <unordered_map></span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <unordered_set></span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <set></span><span> </span></span></li><li class="alt"><span><span class="preprocessor">#include <vector></span><span> </span></span></li><li class=""><span><span class="preprocessor">#include <stack></span><span> </span></span></li><li class="alt"><span><span class="keyword">using</span><span> </span><span class="keyword">namespace</span><span> std; </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">struct</span><span> Node { </span></span></li><li class=""><span> <span class="datatypes">int</span><span> id; </span></span></li><li class="alt"><span> Node* path_father; <span class="comment">//路径中父节点</span><span> </span></span></li><li class=""><span> <span class="datatypes">int</span><span> already; </span><span class="comment">//path中V'中节点数目(默认source和destination不在V'中)</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> path_cost; </span></span></li><li class=""><span> Node(<span class="datatypes">int</span><span> i) : id(i), path_cost(0), already(0), path_father(NULL) {}; </span></span></li><li class="alt"><span> Node(<span class="datatypes">int</span><span> i, </span><span class="datatypes">int</span><span> c, Node* p, </span><span class="datatypes">int</span><span> a) : id(i), path_cost(c), path_father(p), already(a) {}; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">bool</span><span> inPath(</span><span class="datatypes">int</span><span> target) { </span></span></li><li class=""><span> Node* path_rear = <span class="keyword">this</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> (path_rear) { </span></span></li><li class=""><span> <span class="keyword">if</span><span> (target == path_rear->id) </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> path_rear = path_rear->path_father; </span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span>}; </span></li><li class="alt"><span> </span></li><li class=""><span><span class="comment">//pq中优先级的比较</span><span> </span></span></li><li class="alt"><span><span class="keyword">struct</span><span> Compare { </span></span></li><li class=""><span> <span class="comment">//返回 node1优先级低于node2优先级</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">bool</span><span> operator () (Node*node1, Node*node2) { </span></span></li><li class=""><span> <span class="comment">//经过一个V'节点的平均耗费</span><span> </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (!node1->already || !node2->already) { </span></span></li><li class=""><span> <span class="keyword">if</span><span> (!node1->already) </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> </span><span class="keyword">true</span><span>; </span></span></li><li class=""><span> <span class="keyword">return</span><span> </span><span class="keyword">false</span><span>; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="comment">//平均耗费越大,优先级越低</span><span> </span></span></li><li class="alt"><span> <span class="keyword">return</span><span> node1->path_cost / node1->already > node2->path_cost / node2->already; </span></span></li><li class=""><span> } </span></li><li class="alt"><span>}; </span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">class</span><span> Graph { </span></span></li><li class=""><span><span class="keyword">public</span><span>: </span></span></li><li class="alt"><span> <span class="comment">//图信息</span><span> </span></span></li><li class=""><span> unordered_map<<span class="datatypes">int</span><span>, unordered_map<</span><span class="datatypes">int</span><span>, </span><span class="datatypes">int</span><span>>> neighbors;</span><span class="comment">//id:<邻居id:最小边长>集合</span><span> </span></span></li><li class="alt"><span> unordered_map<<span class="datatypes">int</span><span>, </span><span class="datatypes">int</span><span>> edges;</span><span class="comment">//边id:cost</span><span> </span></span></li><li class=""><span> unordered_set<<span class="datatypes">int</span><span>> V;</span><span class="comment">//V'</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> source_id, destination_id; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//优先队列(待扩展点)</span><span> </span></span></li><li class=""><span> priority_queue<Node*, vector<Node*>, Compare> pq; </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//所有node地址集合,便于最后释放</span><span> </span></span></li><li class="alt"><span> set<<span class="datatypes">int</span><span>> node_address; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//最短路径长度初值为极大</span><span> </span></span></li><li class=""><span> <span class="datatypes">int</span><span> min_cost = INT_MAX; </span></span></li><li class="alt"><span> Node* min_path; </span></li><li class=""><span> </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="comment">//TODO:初始化</span><span> </span></span></li><li class="alt"><span> Graph() {}; </span></li><li class=""><span> Graph(<span class="datatypes">char</span><span>* graph[5000], </span><span class="datatypes">int</span><span> edge_num, </span><span class="datatypes">char</span><span> *condition) { initialize(graph, edge_num, condition); }; </span></span></li><li class="alt"><span> ~Graph() { </span></li><li class=""><span> <span class="keyword">for</span><span> (auto a : node_address) { </span></span></li><li class="alt"><span> cout << <span class="string">"is going to delete "</span><span> << ((Node*)a)->id << endl; </span></span></li><li class=""><span> <span class="keyword">delete</span><span> (Node*)a; </span></span></li><li class="alt"><span> } </span></li><li class=""><span> }; </span></li><li class="alt"><span> </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//将当前扩展节点node的 不在node->path中的neighbor节点add到pq中</span><span> </span></span></li><li class=""><span> <span class="keyword">void</span><span> addNeighborsToPq(Node* node) { </span></span></li><li class="alt"><span> <span class="comment">//node的每一条出边</span><span> </span></span></li><li class=""><span> <span class="keyword">for</span><span> (auto pair : neighbors[node->id]) { </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> neighbor_id = pair.first, cost = pair.second;</span><span class="comment">//邻居节点、相应cost</span><span> </span></span></li><li class=""><span> <span class="comment">//已在path中,或未遍历完V情况下到了终点</span><span> </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (node->inPath(neighbor_id) || (node->already < V.size() && neighbor_id == destination_id)) </span></span></li><li class=""><span> <span class="keyword">continue</span><span>; </span></span></li><li class="alt"><span> </span></li><li class=""><span> Node* neighbor_node = <span class="keyword">new</span><span> Node(neighbor_id, </span></span></li><li class="alt"><span> node->path_cost + cost, </span></li><li class=""><span> node, <span class="comment">//path上的父亲节点</span><span> </span></span></li><li class="alt"><span> V.count(neighbor_id) ? node->already + 1 : node->already); </span></li><li class=""><span> node_address.insert((<span class="datatypes">int</span><span>)&(*neighbor_node)); </span></span></li><li class="alt"><span> <span class="comment">//已经过V中全部点 且 该点是终点</span><span> </span></span></li><li class=""><span> <span class="keyword">if</span><span> (neighbor_node->already == V.size() && neighbor_id == destination_id) { </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (neighbor_node->path_cost < min_cost) { </span></span></li><li class=""><span> cout << <span class="string">"change min_cost from "</span><span> << min_cost; </span></span></li><li class="alt"><span> min_cost = neighbor_node->path_cost, min_path = neighbor_node; </span></li><li class=""><span> cout << <span class="string">" to "</span><span> << min_cost << endl; </span></span></li><li class="alt"><span> printPath(min_path); </span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="keyword">else</span><span> </span></span></li><li class="alt"><span> pq.push(neighbor_node); </span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="comment">//取pq的top并将其pop</span><span> </span></span></li><li class=""><span> Node* priorityPop() { </span></li><li class="alt"><span> Node* result = pq.top(); </span></li><li class=""><span> pq.pop(); </span></li><li class="alt"><span> <span class="keyword">return</span><span> result; </span></span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">void</span><span> printPath(Node* path_rear) { </span></span></li><li class="alt"><span> cout << <span class="string">"path : "</span><span>; </span></span></li><li class=""><span> stack<<span class="datatypes">int</span><span>> s; </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> (path_rear) { </span></span></li><li class=""><span> s.push(path_rear->id); </span></li><li class="alt"><span> path_rear = path_rear->path_father; </span></li><li class=""><span> } </span></li><li class="alt"><span> <span class="keyword">while</span><span> (!s.empty()) </span></span></li><li class=""><span> cout << s.top() << <span class="string">" "</span><span>, s.pop(); </span></span></li><li class="alt"><span> cout << endl; </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> <span class="keyword">void</span><span> search() { </span></span></li><li class="alt"><span> cout << <span class="string">"search !!!"</span><span> << endl; </span></span></li><li class=""><span> Node* source_node = <span class="keyword">new</span><span> Node(source_id); </span></span></li><li class="alt"><span> pq.push(source_node); </span></li><li class=""><span> <span class="keyword">while</span><span> (!pq.empty()) { </span></span></li><li class="alt"><span> Node* node = priorityPop(); </span></li><li class=""><span> <span class="keyword">if</span><span> (node->path_cost >= min_cost) </span></span></li><li class="alt"><span> <span class="keyword">continue</span><span>; </span></span></li><li class=""><span> addNeighborsToPq(node); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> cout << endl << endl; </span></li><li class=""><span> cout << <span class="string">"min_cost : "</span><span> << min_cost << endl; </span></span></li><li class="alt"><span> cout << <span class="string">"min_path : "</span><span>; </span></span></li><li class=""><span> printPath(min_path); </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">void</span><span> initialize(</span><span class="datatypes">char</span><span> *graph[5000], </span><span class="datatypes">int</span><span> edge_num, </span><span class="datatypes">char</span><span> *condition) { </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">for</span><span> (</span><span class="datatypes">int</span><span> i = 0; i < edge_num; i++) { </span></span></li><li class=""><span> <span class="datatypes">char</span><span>* line = graph[i]; </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> index = 0; </span></span></li><li class=""><span> <span class="comment">//LinkID</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> l_id = 0; </span></span></li><li class=""><span> <span class="keyword">while</span><span> (line[index] != </span><span class="string">','</span><span>) </span></span></li><li class="alt"><span> l_id = l_id * 10 + line[index++] - <span class="string">'0'</span><span>; </span></span></li><li class=""><span> index++; </span></li><li class="alt"><span> <span class="comment">//SourceID</span><span> </span></span></li><li class=""><span> <span class="datatypes">int</span><span> s_id = 0; </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> (line[index] != </span><span class="string">','</span><span>) </span></span></li><li class=""><span> s_id = s_id * 10 + line[index++] - <span class="string">'0'</span><span>; </span></span></li><li class="alt"><span> index++; </span></li><li class=""><span> <span class="comment">//DestinationID</span><span> </span></span></li><li class="alt"><span> <span class="datatypes">int</span><span> d_id = 0; </span></span></li><li class=""><span> <span class="keyword">while</span><span> (line[index] != </span><span class="string">','</span><span>) </span></span></li><li class="alt"><span> d_id = d_id * 10 + line[index++] - <span class="string">'0'</span><span>; </span></span></li><li class=""><span> index++; </span></li><li class="alt"><span> <span class="comment">//Cost</span><span> </span></span></li><li class=""><span> <span class="datatypes">int</span><span> c = 0; </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> (line[index]) </span></span></li><li class=""><span> c = c * 10 + line[index++] - <span class="string">'0'</span><span>; </span></span></li><li class="alt"><span> <span class="comment">//设置图信息</span><span> </span></span></li><li class=""><span> edges[l_id] = c; </span></li><li class="alt"><span> neighbors[s_id][d_id] = neighbors[s_id][d_id] == 0 ? c : min(neighbors[s_id][d_id], c); </span></li><li class=""><span> </span></li><li class="alt"><span> } </span></li><li class=""><span> <span class="datatypes">int</span><span> index = 0; </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> (condition[index] != </span><span class="string">','</span><span>) </span></span></li><li class=""><span> source_id = source_id * 10 + condition[index++] - <span class="string">'0'</span><span>; </span></span></li><li class="alt"><span> index++; </span></li><li class=""><span> <span class="keyword">while</span><span> (condition[index] != </span><span class="string">','</span><span>) </span></span></li><li class="alt"><span> destination_id = destination_id * 10 + condition[index++] - <span class="string">'0'</span><span>; </span></span></li><li class=""><span> index++; </span></li><li class="alt"><span> </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">while</span><span> (condition[index]) { </span></span></li><li class=""><span> <span class="datatypes">int</span><span> node_id = 0; </span></span></li><li class="alt"><span> <span class="keyword">while</span><span> (condition[index] && condition[index] != </span><span class="string">'|'</span><span>) </span></span></li><li class=""><span> node_id = node_id * 10 + condition[index++] - <span class="string">'0'</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">if</span><span> (condition[index]) </span></span></li><li class=""><span> index++; </span></li><li class="alt"><span> V.insert(node_id); </span></li><li class=""><span> } </span></li><li class="alt"><span> } </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="keyword">void</span><span> printGraph() { </span></span></li><li class=""><span> cout << <span class="string">"printGraph !!!"</span><span> << endl; </span></span></li><li class="alt"><span> </span></li><li class=""><span> cout << <span class="string">"V' : "</span><span>; </span></span></li><li class="alt"><span> <span class="keyword">for</span><span> (auto node : V) </span></span></li><li class=""><span> cout << node << <span class="string">" | "</span><span>; </span></span></li><li class="alt"><span> cout << endl; </span></li><li class=""><span> </span></li><li class="alt"><span> cout << <span class="string">"source_id : "</span><span> << source_id << endl; </span></span></li><li class=""><span> cout << <span class="string">"destination_id : "</span><span> << destination_id << endl; </span></span></li><li class="alt"><span> </span></li><li class=""><span> cout << <span class="string">"edges:"</span><span> << endl; </span></span></li><li class="alt"><span> <span class="keyword">for</span><span> (auto edge : edges) </span></span></li><li class=""><span> cout << <span class="string">" LinkID "</span><span> << edge.first << </span><span class="string">" : cost "</span><span> << edge.second << endl; </span></span></li><li class="alt"><span> </span></li><li class=""><span> cout << <span class="string">"neighbors:"</span><span> << endl; </span></span></li><li class="alt"><span> <span class="keyword">for</span><span> (auto pair : neighbors) </span></span></li><li class=""><span> <span class="keyword">for</span><span> (auto neighbor : pair.second) </span></span></li><li class="alt"><span> cout << <span class="string">" source_id "</span><span> << pair.first << </span><span class="string">" : destination_id "</span><span> << neighbor.first << </span><span class="string">" : shortest_edges_len "</span><span> << neighbor.second << endl; </span></span></li><li class=""><span> </span></li><li class="alt"><span> cout << endl; </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span>}; </span></li><li class="alt"><span> </span></li><li class=""><span><span class="comment">你要完成的功能总入口</span><span> </span></span></li><li class="alt"><span><span class="comment">//void search_route(char *graph[5000], int edge_num, char *condition)</span><span> </span></span></li><li class=""><span><span class="comment">//{</span><span> </span></span></li><li class="alt"><span><span class="comment">// unsigned short result[] = { 2, 6, 3 };//示例中的一个解</span><span> </span></span></li><li class=""><span><span class="comment">//</span><span> </span></span></li><li class="alt"><span><span class="comment">// for (int i = 0; i < 3; i++)</span><span> </span></span></li><li class=""><span><span class="comment">// record_result(result[i]);</span><span> </span></span></li><li class="alt"><span><span class="comment">//}</span><span> </span></span></li><li class=""><span> </span></li><li class="alt"><span><span class="keyword">void</span><span> main() { </span></span></li><li class=""><span> <span class="datatypes">char</span><span> graph[7][8] = </span></span></li><li class="alt"><span> { <span class="string">"0,0,1,1"</span><span>, </span></span></li><li class=""><span> <span class="string">"1,0,2,2"</span><span>, </span></span></li><li class="alt"><span> <span class="string">"2,0,3,1"</span><span>, </span></span></li><li class=""><span> <span class="string">"3,2,1,3"</span><span>, </span></span></li><li class="alt"><span> <span class="string">"4,3,1,1"</span><span>, </span></span></li><li class=""><span> <span class="string">"5,2,3,1"</span><span>, </span></span></li><li class="alt"><span> <span class="string">"6,3,2,1"</span><span> }; </span></span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">char</span><span>* G[5000]; </span></span></li><li class=""><span> <span class="keyword">for</span><span> (</span><span class="datatypes">int</span><span> i = 0; i < 7; i++) { </span></span></li><li class="alt"><span> G[i] = <span class="keyword">new</span><span> </span><span class="datatypes">char</span><span>[8]; </span></span></li><li class=""><span> <span class="keyword">for</span><span> (</span><span class="datatypes">int</span><span> j = 0; j < 8; j++) </span></span></li><li class="alt"><span> G[i][j] = graph[i][j]; </span></li><li class=""><span> } </span></li><li class="alt"><span> </span></li><li class=""><span> </span></li><li class="alt"><span> <span class="datatypes">char</span><span>* condition = </span><span class="string">"0,1,2|3"</span><span>; </span></span></li><li class=""><span> </span></li><li class="alt"><span> Graph g(G, 7, condition); </span></li><li class=""><span> g.printGraph(); </span></li><li class="alt"><span> g.search(); </span></li><li class=""><span> system(<span class="string">"pause"</span><span>); </span></span></li><li class="alt"><span>} </span></li></ol></div>
分支定界法
最新推荐文章于 2021-03-10 19:57:54 发布