分支定界法

<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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值