commit 0a47ec4047cc8af7f4964237dda6ad9b5b7d3b9d
parent 1637c7d79df159a2076f2f496ace41259e1de4c5
Author: Jachiet Louis <louis@jachiet.com>
Date:   Sat,  5 Apr 2014 13:08:51 +0200
Ajout de plus court chemin
Diffstat:
2 files changed, 61 insertions(+), 58 deletions(-)
diff --git a/contest/louis/louis.cpp b/contest/louis/louis.cpp
@@ -0,0 +1,61 @@
+#include <cstdio>
+#include <algorithm>
+#include <future>
+#include <vector>
+#include <queue>
+
+using namespace std;
+
+
+class louis
+{
+
+  const int nbVoitures = 8 ;
+  const int nbSommets = 11348 ;
+  const int nbArcs = 17958 ;
+  const int nbSecondes = 54000 ;
+  const int depart = 4516 ;
+  const int INF = 1000 * 1000 * 100 ;
+  short use[nbSommets][nbSommets] ;
+  int cur_dist[nbSommets] ;
+
+  louis()
+  {
+    fill(use[0],use[nbSommets],-1);
+  }
+
+  // Renvoie la première intersection à utiliser
+  int go_to( int depart, int arrivee)
+  {
+    if(use[depart][depart] == -1)
+      return use[depart][arrivee] ;
+    fill(cur_dist,cur_dist+nbSommets,INF);
+    priority_queue<pair<int,int> > todo ;
+    use[depart][depart] = depart ;
+    todo.push(makepair(0,depart));
+    use[depart]
+    while(!todo.empty())
+      {
+	pair<int,int> t = todo.top();
+	todo.pop();
+	t.first *= -1 ;
+	if(t.first == cur_dist[t.second])
+	  {
+	    for(int v : adj[t.second] )
+	      {
+		const int nouv_dist = t.first + longueur[id_arete[make_pair(t.first)]];
+		if( nouv_dist != cur_dist[v] )
+		  {
+		    if(t.first)
+		      use[depart][v] = v ;
+		    else
+		      use[depart][v] = use[depart][t.first] ;
+
+		    cur_dist[v] = nouv_dist ;
+		    todo.push(makepair(-nouv_dist,v));
+		  }
+	      }
+	  }
+      }
+  }
+};
diff --git a/contest/louis/main.cc b/contest/louis/main.cc
@@ -1,58 +0,0 @@
-#include <cstdio>
-#include <algorithm>
-#include <future>
-#include <vector>
-#include <queue>
-
-using namespace std;
-
-
-class louis
-{
-
-  const int nbVoitures = 8 ;
-  const int nbSommets = 11348 ;
-  const int nbArcs = 17958 ;
-  const int nbSecondes = 54000 ;
-  const int depart = 4516 ;
-  const int INF = 1000 * 1000 * 100 ;
-  vector<int> use[nbSommets] ;
-
-  // Renvoie la première intersection à utiliser
-  int go_to( int depart, int arrivee)
-  {
-    if(use[depart].size())
-      return use[depart][arrivee] ;
-    int cur_dist[nbSommets] ;
-    priority_queue<pair<int,int> > todo ;
-    todo.push(makepair(0,depart));
-    
-    fill(dist,dist+nbSommets,INF);
-    while(!todo.empty())
-      {
-	pair<int,int> t = todo.top();
-	todo.pop();
-	t.first *= -1 ;
-	if(t.first == cur_dist[t.second])
-	  {
-	    for(int v : get_vois(t.second) )
-	      {
-		const int nouv_dist = t.first + get_dist(t.first,v);
-		if( nouv_dist != cur_dist[v] )
-		  {
-		    cur_dist[v] = nouv_dist ;
-		    todo.push(makepair(-nouv_dist,v));
-		  }
-	      }
-	  }
-      }
-  }
-
-
-
-
-int main()
-{
-  std::future<bool> fut = async (is_prime,444444443); 
-  return 0;
-}