shorttest.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:10k
开发平台:

MultiPlatform

  1. #include <LEDA/stream.h>
  2. #include <LEDA/ugraph.h>
  3. #include <LEDA/node_pq.h>
  4. #include <LEDA/b_node_pq.h>
  5. #include <LEDA/node_slist.h>
  6. int  dijkstra1(UGRAPH<int,int>& g, node source, node target) 
  7. {
  8.   // use a linear list priority queue  (node_list)
  9.   // and node_array<int> for dist values
  10.   node_array<int> dist(g,MAXINT); // initialize labels
  11.   node_list      labeled;        // candidate nodes
  12.   node v;
  13.   dist[source] = 0;
  14.   labeled.push(source);
  15.   while ( ! labeled.empty() )
  16.   {
  17.     // find node v with minimal dist[v] by linear search
  18.     v = labeled.first();
  19.     int dv = dist[v];
  20.     node u = labeled.succ(v);
  21.     while (u)
  22.     { if (dist[u] < dv)  { v = u; dv = dist[v]; }
  23.        u = labeled.succ(u);
  24.      }
  25.       
  26.     if (v == target) break;
  27.     edge e;
  28.     forall_adj_edges(e,v) 
  29.     { node w = g.opposite(v,e);
  30.       int  d = dist[v] + g[e];
  31.       if (dist[w] > d) 
  32.       { if (dist[w] == MAXINT) labeled.append(w); // first time touched
  33. dist[w] = d;
  34.        }
  35.       }
  36.     labeled.del(v);
  37.   } 
  38.   return dist[v];
  39. }
  40. int  dijkstra2(UGRAPH<int,int>& g, node source, node target) 
  41. {
  42.   // use a node priority queue (node_pq)
  43.   // and node_array<int> for dist values
  44.   node_array<int> dist(g,MAXINT); // initialize labels
  45.   dist[source] = 0;
  46.   node_pq<int> PQ(g);             // candidate nodes
  47.   PQ.insert(source,0);
  48.   while (! PQ.empty())
  49.   { 
  50.     node v = PQ.del_min();
  51.     int dv = dist[v];
  52.     if (v == target) break;
  53.     edge e;
  54.     forall_adj_edges(e,v)
  55.     { node w = g.opposite(v,e);
  56.       int d = dv + g[e];
  57.       if (d < dist[w]) 
  58.       { if (dist[w] == MAXINT)
  59.            PQ.insert(w,d);
  60.         else
  61.            PQ.decrease_inf(w,d);
  62.         dist[w] = d;
  63.        }
  64.     }
  65.   }
  66.   return dist[target];
  67. }
  68. int dijkstra3(UGRAPH<int,int>& g, node s, node t) 
  69. {
  70.   // use a bounded node priority queue (b_node_pq)
  71.   // and a node_array<int> for dist values
  72.   node_array<int> dist(g,MAXINT);
  73.   b_node_pq<101> PQ(t);  // on empty queue del_min returns t 
  74.   node v;
  75.   dist[s] = 0;
  76.   PQ.insert(s,0);
  77.   while ( (v = PQ.del_min()) != t )
  78.   { int dv = dist[v];
  79.     edge e;
  80.     forall_adj_edges(e,v) 
  81.     { node w = g.opposite(v,e);
  82.       int d = dv + g[e];
  83.       if (d < dist[w])
  84.       { if (dist[w] != MAXINT) PQ.del(w);
  85. dist[w] = d;
  86.         PQ.insert(w,d);
  87.        }
  88.      }
  89.    }
  90.   return dist[t];
  91. }
  92. int dijkstra4(UGRAPH<int,int>& g, node s, node t) 
  93. {
  94.   // use a bounded node priority queue (b_node_pq)
  95.   // and node_array<int> for dist values
  96.   node_array<int> dist(g,MAXINT);
  97.   b_node_pq<101> PQ(t);  // on empty queue del_min returns t 
  98.   node v;
  99.   dist[s] = 0;
  100.   PQ.insert(s,0);
  101.   while ( (v = PQ.del_min()) != t )
  102.   { int dv = dist[v];
  103.     edge e;
  104.     forall_adj_edges(e,v) 
  105.     { node w = g.opposite(v,e);
  106.       int d = dv + g[e];
  107.       if (d < dist[w])
  108.       { if (dist[w] != MAXINT) PQ.del(w);
  109. dist[w] = d;
  110.         PQ.insert(w,d);
  111.        }
  112.      }
  113.    }
  114.   return dist[t];
  115. }
  116. int dijkstra5(UGRAPH<int,int>& g, node s, node t) 
  117. {
  118.   // use a bounded node priority queue (b_node_pq)
  119.   // and the node information of g for  dist values
  120.   b_node_pq<101> PQ(t);  // on empty queue del_min returns t 
  121.   node v;
  122.   forall_nodes(v,g) g[v] = MAXINT;
  123.   g[s] = 0;
  124.   PQ.insert(s,0);
  125.   while ( (v = PQ.del_min()) != t )
  126.   { int dv = g[v];
  127.     edge e;
  128.     forall_adj_edges(e,v) 
  129.     { node w = g.opposite(v,e);
  130.       int d = dv + g[e];
  131.       if (d < g[w])
  132.       { if (g[w] != MAXINT) PQ.del(w);
  133. g[w] = d;
  134.         PQ.insert(w,d);
  135.        }
  136.      }
  137.    }
  138.   return g[t];
  139. }
  140. int dijkstra6(UGRAPH<int,int>& g, node s, node t) 
  141. {
  142.   // use a bounded node priority queue (b_node_pq)
  143.   // and the node information of g for  dist values
  144.   b_node_pq<101> PQ(t);  // on empty queue del_min returns t 
  145.   node v;
  146.   forall_nodes(v,g) g[v] = MAXINT;
  147.   g[s] = 0;
  148.   PQ.insert(s,0);
  149.   while ( (v = PQ.del_min()) != t )
  150.   { int dv = g[v];
  151.     edge e;
  152.     forall_adj_edges(e,v) 
  153.     { node w = g.opposite(v,e);
  154.       int d = dv + g[e];
  155.       if (d < g[w])
  156.       { if (g[w] != MAXINT) PQ.del(w);
  157. g[w] = d;
  158.         PQ.insert(w,d);
  159.        }
  160.      }
  161.    }
  162.   return g[t];
  163. }
  164. int  moore1(UGRAPH<int,int>& g, node source, node target)
  165. {
  166.   // use a queue of candidate nodes (node_list)
  167.   // and node_array<int> for dist values
  168.   node_array<int> dist(g,MAXINT);   // initialize labels
  169.   dist[source] = 0;
  170.   node_list labeled;               // queue of candidate nodes
  171.   labeled.append(source);
  172.   while (! labeled.empty()) 
  173.   { node v = labeled.pop();
  174.     int dv = dist[v];
  175.     if (dv >= dist[target]) continue;
  176.     edge e;
  177.     forall_adj_edges(e,v) 
  178.     { node w = g.opposite(v,e);
  179.       int d = dv + g[e];
  180.       if (d < dist[w]) 
  181.       { if (!labeled(w)) labeled.append(w);
  182. dist[w] = d;
  183.        }
  184.      }
  185.    }
  186.   return dist[target];
  187. }
  188. int  moore2(UGRAPH<int,int>& g, node source, node target) 
  189. {
  190.   // use a double ended queue of candidate nodes (node_list)
  191.   // and a node_array<int> for dist values
  192.   node_array<int> dist(g,MAXINT); // initialize labels
  193.   dist[source] = 0;
  194.   node_list labeled;             // deque of candidate nodes
  195.   labeled.append(source);
  196.   while (! labeled.empty()) 
  197.   { 
  198.     node v = labeled.pop();
  199.     int dv = dist[v];
  200.     if (dv > dist[target]) continue;
  201.     edge e;
  202.     forall_adj_edges(e,v)
  203.     { node w = g.opposite(v,e);
  204.       int  d = dv + g[e];
  205.       if (d < dist[w]) 
  206.       { if ( ! labeled(w) ) 
  207.         { if (dist[w] == MAXINT)
  208.        labeled.append(w);
  209.     else
  210.        labeled.push(w);
  211.    }
  212.   dist[w] = d;
  213.        }
  214.      }
  215.   }
  216.   return dist[target];
  217. }
  218. int  moore3(UGRAPH<int,int>& g, node source, node target) 
  219. {
  220.   // use a double ended queue of candidate nodes (node_list)
  221.   // and the node information of g for  dist values
  222.   node v;
  223.   forall_nodes(v,g) g[v] = MAXINT;  // initialize labels
  224.   g[source] = 0;
  225.   node_list labeled;             // deque of candidate nodes
  226.   labeled.append(source);
  227.   while (! labeled.empty()) 
  228.   { 
  229.     node v = labeled.pop();
  230.     int dv = g[v];
  231.     if (dv > g[target]) continue;
  232.     edge e;
  233.     forall_adj_edges(e,v)
  234.     { node w = g.opposite(v,e);
  235.       int  d = dv + g[e];
  236.       if (d < g[w]) 
  237.       { if ( ! labeled(w) ) 
  238.         { if (g[w] == MAXINT)
  239.        labeled.append(w);
  240.     else
  241.        labeled.push(w);
  242.    }
  243.   g[w] = d;
  244.        }
  245.      }
  246.   }
  247.   return g[target];
  248. }
  249. int  moore4(UGRAPH<int,int>& g, node source, node target) 
  250. {
  251.   // use a double ended queue of candidate nodes (node_slist)
  252.   // and the node information of g for  dist values
  253.   node v;
  254.   forall_nodes(v,g) g[v] = MAXINT;  // initialize labels
  255.   g[source] = 0;
  256.   node_slist labeled(g);            // deque of candidate nodes
  257.   labeled.append(source);
  258.   while (! labeled.empty()) 
  259.   { 
  260.     node v = labeled.pop();
  261.     int dv = g[v];
  262.     if (dv > g[target]) continue;
  263.     edge e;
  264.     forall_adj_edges(e,v)
  265.     { node w = g.opposite(v,e);
  266.       int  d = dv + g[e];
  267.       if (d < g[w]) 
  268.       { if (g[w] == MAXINT) labeled.append(w);
  269. else if (!labeled(w)) labeled.push(w);
  270. g[w] = d;
  271.        }
  272.      }
  273.   }
  274.   return g[target];
  275. }
  276. GRAPH<int,int> make_bidirected(GRAPH<int,int>& G)
  277. {
  278.   edge last = G.last_edge();
  279.   for(edge e = G.first_edge(); e != last; e = G.succ_edge(e))
  280.   G.new_edge(target(e),source(e),G[e]);
  281.   return G;
  282. }
  283. int main (int argc, char** argv) 
  284. {
  285.   GRAPH<int,int>   G0;
  286.   int sourcename;
  287.   int targetname;
  288.   int len;
  289.   string filename = "grid100";
  290.   if (argc > 1) filename = argv[1];
  291.   // read names of source and target from file <filename>
  292.   file_istream  infile (filename);
  293.   if ( ! (infile >> sourcename >> targetname) )
  294.   { cerr << "Cannot read file " << filename << endl;
  295.     exit(1);
  296.    }
  297.   cout << "Source node: " << sourcename << endl;
  298.   cout << "Target node: " << targetname << endl;
  299.   newline;
  300.   // read graph from file <filename>.graph
  301.   float t0 = used_time();
  302.   if (G0.read(filename + ".graph") != 0)
  303.   { cerr << "Cannot read graph from file " << filename << ".graph" << endl;
  304.     exit(1);
  305.    }
  306.   cout << string("Time for reading:  %5.2f",used_time(t0)) << endl;
  307.   newline;
  308.   UGRAPH<int,int>  g = G0;
  309.   GRAPH<int,int> G = make_bidirected(G0);
  310.   cout << string("Time for making undirected:  %5.2f",used_time(t0)) << endl;
  311.   newline;
  312.   // search for source and target nodes
  313.   node source = nil;
  314.   node target = nil;
  315.   node v;
  316.   forall_nodes(v,g) 
  317.   { if (g[v] == sourcename) source = v;
  318.     if (g[v] == targetname) target = v;
  319.    }
  320.   node sourceG = nil;
  321.   node targetG = nil;
  322.   forall_nodes(v,G) 
  323.   { if (G[v] == sourcename) sourceG = v;
  324.     if (G[v] == targetname) targetG = v;
  325.    }
  326.   t0 = used_time();
  327.   if (g.number_of_edges() < 20000)
  328.   { len = dijkstra1(g, source, target);
  329.     cout <<string("Time for dijkstra1: %5.3f pathlength: %d",used_time(t0),len);
  330.     newline;
  331.    }
  332.   
  333.   len = dijkstra2(g, source, target);
  334.   cout <<string("Time for dijkstra2: %5.3f pathlength: %d",used_time(t0),len);
  335.   newline;
  336.   
  337.   len = dijkstra3(g, source, target);
  338.   cout <<string("Time for dijkstra3: %5.3f pathlength: %d",used_time(t0),len);
  339.   newline;
  340.   len = dijkstra4(g, source, target);
  341.   cout <<string("Time for dijkstra4: %5.3f pathlength: %d",used_time(t0),len);
  342.   newline;
  343.   len = dijkstra5(g, source, target);
  344.   cout <<string("Time for dijkstra5: %5.3f pathlength: %d",used_time(t0),len);
  345.   newline;
  346.   len = dijkstra6(g, source, target);
  347.   cout <<string("Time for dijkstra6: %5.3f pathlength: %d",used_time(t0),len);
  348.   newline;
  349.   
  350. /*
  351.   len = moore1(g, source, target);
  352.   cout <<string("Time for moore1:    %5.3f pathlength: %d",used_time(t0),len);
  353.   newline;
  354. */
  355.   
  356.   len = moore2(g, source, target);
  357.   cout <<string("Time for moore2:    %5.3f pathlength: %d",used_time(t0),len);
  358.   newline;
  359.   len = moore3(g, source, target);
  360.   cout <<string("Time for moore3:    %5.3f pathlength: %d",used_time(t0),len);
  361.   newline;
  362.   len = moore4(g, source, target);
  363.   cout <<string("Time for moore4:    %5.3f pathlength: %d",used_time(t0),len);
  364.   newline;
  365.   return 0;
  366. }