Last active
March 3, 2022 03:33
-
-
Save ewalk153/5d7a609d61477e8ebbee267b7474e968 to your computer and use it in GitHub Desktop.
Parsing code to convert metro line stop times to a series of nodes and edges.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Line | Start | End | Duration | One Way? | |
|---|---|---|---|---|---|
| 1 | Château de Vincennes | ||||
| 1 | Bérault | Château de Vincennes | 0:01 | ||
| 1 | Saint-Mandé–Tourelle | Bérault | 0:01 | ||
| 1 | Porte de Vincennes | Saint-Mandé–Tourelle | 0:01 | ||
| 1 | Nation | Porte de Vincennes | 0:02 | ||
| 1 | Reuilly–Diderot | Nation | 0:02 | ||
| 1 | Gare de Lyon | Reuilly–Diderot | 0:01 | ||
| 1 | Bastille | Gare de Lyon | 0:02 | ||
| 1 | Saint-Paul | Bastille | 0:02 | ||
| 1 | Hôtel de Ville | Saint-Paul | 0:01 | ||
| 1 | Châtelet | Hôtel de Ville | 0:02 | ||
| 1 | Louvre–Rivoli | Châtelet | 0:01 | ||
| 1 | Palais Royal–Musée du Louvre | Louvre–Rivoli | 0:01 | ||
| 1 | Tuileries | Palais Royal–Musée du Louvre | 0:01 | ||
| 1 | Concorde | Tuileries | 0:01 | ||
| 1 | Champs Élysées–Clemenceau | Concorde | 0:02 | ||
| 1 | Franklin D. Roosevelt | Champs Élysées–Clemenceau | 0:02 | ||
| 1 | George V | Franklin D. Roosevelt | 0:01 | ||
| 1 | Charles de Gaulle Etoile | George V | 0:01 | ||
| 1 | Argentine | Charles de Gaulle Etoile | 0:02 | ||
| 1 | Porte Maillot | Argentine | 0:01 | ||
| 1 | Les Sablons | Porte Maillot | 0:02 | ||
| 1 | Pont de Neuilly | Les Sablons | 0:01 | ||
| 1 | Esplanade de La Défense | Pont de Neuilly | 0:02 | ||
| 1 | La Défense | Esplanade de La Défense | 0:02 | ||
| 2 | Nation | ||||
| 2 | Avron | Nation | 0:01 | ||
| 2 | Alexandre Dumas | Avron | 0:01 | ||
| 2 | Philippe Auguste | Alexandre Dumas | 0:01 | ||
| 2 | Père Lachaise | Philippe Auguste | 0:02 | ||
| 2 | Ménilmontant | Père Lachaise | 0:01 | ||
| 2 | Couronnes | Ménilmontant | 0:01 | ||
| 2 | Belleville | Couronnes | 0:01 | ||
| 2 | Colonel Fabien | Belleville | 0:02 | ||
| 2 | Jaurès | Colonel Fabien | 0:01 | ||
| 2 | Stalingrad | Jaurès | 0:02 | ||
| 2 | La Chapelle | Stalingrad | 0:01 | ||
| 2 | Barbès-Rochechouart | La Chapelle | 0:02 | ||
| 2 | Anvers | Barbès-Rochechouart | 0:01 | ||
| 2 | Pigalle | Anvers | 0:02 | ||
| 2 | Blanche | Pigalle | 0:01 | ||
| 2 | Place de Clichy | Blanche | 0:02 | ||
| 2 | Rome | Place de Clichy | 0:01 | ||
| 2 | Villiers | Rome | 0:02 | ||
| 2 | Monceau | Villiers | 0:01 | ||
| 2 | Courcelles | Monceau | 0:01 | ||
| 2 | Ternes | Courcelles | 0:02 | ||
| 2 | Charles de Gaulle Etoile | Ternes | 0:01 | ||
| 2 | Victor Hugo | Charles de Gaulle Etoile | 0:02 | ||
| 2 | Porte Dauphine | Victor Hugo | 0:03 | ||
| 3 | Gallieni | ||||
| 3 | Porte de Bagnolet | Gallieni | 0:01 | ||
| 3 | Gambetta | Porte de Bagnolet | 0:01 | ||
| 3 | Père Lachaise | Gambetta | 0:02 | ||
| 3 | Rue Saint-Maur | Père Lachaise | 0:01 | ||
| 3 | Parmentier | Rue Saint-Maur | 0:01 | ||
| 3 | République | Parmentier | 0:02 | ||
| 3 | Temple | République | 0:01 | ||
| 3 | Arts et Métiers | Temple | 0:01 | ||
| 3 | Réaumur-Sébastopol | Arts et Métiers | 0:01 | ||
| 3 | Sentier | Réaumur-Sébastopol | 0:01 | ||
| 3 | Bourse | Sentier | 0:02 | ||
| 3 | Quatre-Septembre | Bourse | 0:01 | ||
| 3 | Opéra | Quatre-Septembre | 0:01 | ||
| 3 | Havre-Caumartin | Opéra | 0:01 | ||
| 3 | Saint-Lazare | Havre-Caumartin | 0:01 | ||
| 3 | Europe | Saint-Lazare | 0:02 | ||
| 3 | Villiers | Europe | 0:01 | ||
| 3 | Malesherbes | Villiers | 0:02 | ||
| 3 | Wagram | Malesherbes | 0:01 | ||
| 3 | Pereire | Wagram | 0:01 | ||
| 3 | Porte de Champerret | Pereire | 0:01 | ||
| 3 | Louise Michel | Porte de Champerret | 0:01 | ||
| 3 | Anatole France | Louise Michel | 0:02 | ||
| 3 | Pont de Levallois | Anatole France | 0:02 | ||
| 3bis | Porte des Lilas | ||||
| 3bis | Saint-Fargeau | Porte des Lilas | 0:01 | ||
| 3bis | Pelleport | Saint-Fargeau | 0:01 | ||
| 3bis | Gambetta | Pelleport | 0:01 | ||
| 4 | Porte de Clignancourt | ||||
| 4 | Simplon | Porte de Clignancourt | 0:01 | ||
| 4 | Marcadet–Poissonniers | Simplon | 0:01 | ||
| 4 | Château Rouge | Marcadet–Poissonniers | 0:01 | ||
| 4 | Barbès–Rochechouart | Château Rouge | 0:01 | ||
| 4 | Gare du Nord | Barbès–Rochechouart | 0:02 | ||
| 4 | Gare de l’Est | Gare du Nord | 0:02 | ||
| 4 | Château d’Eau | Gare de l’Est | 0:01 | ||
| 4 | Strasbourg–Saint-Denis | Château d’Eau | 0:01 | ||
| 4 | Réaumur–Sébastopol | Strasbourg–Saint-Denis | 0:01 | ||
| 4 | Étienne Marcel | Réaumur–Sébastopol | 0:02 | ||
| 4 | Les Halles | Étienne Marcel | 0:01 | ||
| 4 | Châtelet | Les Halles | 0:01 | ||
| 4 | Cité | Châtelet | 0:02 | ||
| 4 | Saint-Michel | Cité | 0:01 | ||
| 4 | Odéon | Saint-Michel | 0:01 | ||
| 4 | Saint-Germain-des-Prés | Odéon | 0:01 | ||
| 4 | Saint-Sulpice | Saint-Germain-des-Prés | 0:01 | ||
| 4 | Saint-Placide | Saint-Sulpice | 0:02 | ||
| 4 | Montparnasse–Bienvenüe | Saint-Placide | 0:01 | ||
| 4 | Vavin | Montparnasse–Bienvenüe | 0:01 | ||
| 4 | Raspail | Vavin | 0:02 | ||
| 4 | Denfert-Rochereau | Raspail | 0:01 | ||
| 4 | Mouton-Duvernet | Denfert-Rochereau | 0:01 | ||
| 4 | Alésia | Mouton-Duvernet | 0:01 | ||
| 4 | Porte d’Orléans | Alésia | 0:02 | ||
| 5 | Bobigny–Pablo Picasso | ||||
| 5 | Bobigny-Pantin–Raymond | Bobigny–Pablo Picasso | 0:03 | ||
| 5 | Queneau Église de Pantin | Bobigny-Pantin–Raymond | 0:02 | ||
| 5 | Hoche | Queneau Église de Pantin | 0:01 | ||
| 5 | Porte de Pantin | Hoche | 0:02 | ||
| 5 | Ourcq | Porte de Pantin | 0:01 | ||
| 5 | Laumière | Ourcq | 0:01 | ||
| 5 | Jaurès | Laumière | 0:02 | ||
| 5 | Stalingrad | Jaurès | 0:01 | ||
| 5 | Gare du Nord | Stalingrad | 0:02 | ||
| 5 | Gare de l’Est | Gare du Nord | 0:03 | ||
| 5 | Jacques Bonsergent | Gare de l’Est | 0:02 | ||
| 5 | République | Jacques Bonsergent | 0:01 | ||
| 5 | Oberkampf | République | 0:02 | ||
| 5 | Richard-Lenoir | Oberkampf | 0:01 | ||
| 5 | Bréguet-Sabin | Richard-Lenoir | 0:02 | ||
| 5 | Bastille | Bréguet-Sabin | 0:01 | ||
| 5 | Quai de la Rapée | Bastille | 0:02 | ||
| 5 | Gare d’Austerlitz | Quai de la Rapée | 0:02 | ||
| 5 | Saint-Marcel | Gare d’Austerlitz | 0:01 | ||
| 5 | Campo-Formio | Saint-Marcel | 0:01 | ||
| 5 | Place d’Italie | Campo-Formio | 0:04 | ||
| 6 | Nation | ||||
| 6 | Picpus | Nation | 0:01 | ||
| 6 | Bel Air | Picpus | 0:01 | ||
| 6 | Daumesnil | Bel Air | 0:01 | ||
| 6 | Dugommier | Daumesnil | 0:01 | ||
| 6 | Bercy | Dugommier | 0:01 | ||
| 6 | Quai de la Gare | Bercy | 0:02 | ||
| 6 | Chevaleret | Quai de la Gare | 0:01 | ||
| 6 | Nationale | Chevaleret | 0:01 | ||
| 6 | Place d’Italie | Nationale | 0:01 | ||
| 6 | Corvisart | Place d’Italie | 0:01 | ||
| 6 | Glacière | Corvisart | 0:02 | ||
| 6 | Saint-Jacques | Glacière | 0:01 | ||
| 6 | Denfert-Rochereau | Saint-Jacques | 0:01 | ||
| 6 | Raspail | Denfert-Rochereau | 0:01 | ||
| 6 | Edgar Quinet | Raspail | 0:01 | ||
| 6 | Montparnasse–Bienvenüe | Edgar Quinet | 0:01 | ||
| 6 | Pasteur | Montparnasse–Bienvenüe | 0:02 | ||
| 6 | Sèvres–Lecourbe | Pasteur | 0:01 | ||
| 6 | Cambronne | Sèvres–Lecourbe | 0:01 | ||
| 6 | La Motte-Picquet–Grenelle | Cambronne | 0:01 | ||
| 6 | Dupleix | La Motte-Picquet–Grenelle | 0:02 | ||
| 6 | Bir-Hakeim | Dupleix | 0:01 | ||
| 6 | Passy | Bir-Hakeim | 0:01 | ||
| 6 | Trocadéro | Passy | 0:01 | ||
| 6 | Boissière | Trocadéro | 0:01 | ||
| 6 | Kléber | Boissière | 0:02 | ||
| 6 | Charles de Gaulle Etoile | Kléber | 0:02 | ||
| 7 | La Courneuve–8 mai 1945 | ||||
| 7 | Fort d’Aubervilliers | La Courneuve–8 mai 1945 | 0:01 | ||
| 7 | Aubervilliers–Pantin–Q. Chemins | Fort d’Aubervilliers | 0:02 | ||
| 7 | Porte de la Villette | Aubervilliers–Pantin–Q. Chemins | 0:02 | ||
| 7 | Corentin Cariou | Porte de la Villette | 0:02 | ||
| 7 | Crimée | Corentin Cariou | 0:01 | ||
| 7 | Riquet | Crimée | 0:01 | ||
| 7 | Stalingrad | Riquet | 0:01 | ||
| 7 | Louis Blanc | Stalingrad | 0:02 | ||
| 7 | Château Landon | Louis Blanc | 0:01 | ||
| 7 | Gare de l’Est | Château Landon | 0:01 | ||
| 7 | Poissonnière | Gare de l’Est | 0:02 | ||
| 7 | Cadet | Poissonnière | 0:01 | ||
| 7 | Le Peletier | Cadet | 0:01 | ||
| 7 | Chaussée d’Antin–La Fayette | Le Peletier | 0:02 | ||
| 7 | Opéra | Chaussée d’Antin–La Fayette | 0:01 | ||
| 7 | Pyramides | Opéra | 0:02 | ||
| 7 | Palais-Royal–Musée du Louvre | Pyramides | 0:01 | ||
| 7 | Pont Neuf | Palais-Royal–Musée du Louvre | 0:02 | ||
| 7 | Châtelet | Pont Neuf | 0:01 | ||
| 7 | Pont Marie | Châtelet | 0:02 | ||
| 7 | Sully–Morland | Pont Marie | 0:01 | ||
| 7 | Jussieu | Sully–Morland | 0:02 | ||
| 7 | Place Monge | Jussieu | 0:01 | ||
| 7 | Censier–Daubenton | Place Monge | 0:01 | ||
| 7 | Les Gobelins | Censier–Daubenton | 0:01 | ||
| 7 | Place d’Italie | Les Gobelins | 0:02 | ||
| 7 | Tolbiac | Place d’Italie | 0:01 | ||
| 7 | Maison Blanche | Tolbiac | 0:01 | ||
| 7 | Porte d’Italie | Maison Blanche | 0:02 | ||
| 7 | Porte de Choisy | Porte d’Italie | 0:01 | ||
| 7 | Porte d’Ivry | Porte de Choisy | 0:01 | ||
| 7 | Pierre et Marie Curie | Porte d’Ivry | 0:02 | ||
| 7 | Mairie d’ Ivry | Pierre et Marie Curie | 0:03 | ||
| 7 | Maison Blanche | ||||
| 7 | Le Kremlin-Bicêtre | Maison Blanche | 0:02 | ||
| 7 | Villejuif–Léo Lagrange | Le Kremlin-Bicêtre | 0:01 | ||
| 7 | Villejuif–P. Vaillant-Couturier | Villejuif–Léo Lagrange | 0:02 | ||
| 7 | Villejuif–Louis Aragon | Villejuif–P. Vaillant-Couturier | 0:03 | ||
| 7bis | Pré-Saint-Gervais | ||||
| 7bis | Danube | Pré-Saint-Gervais | 0:01 | -1 | |
| 7bis | Botzaris | Danube | 0:01 | -1 | |
| 7bis | Buttes Chaumont | Botzaris | 0:01 | ||
| 7bis | Bolivar | Buttes Chaumont | 0:01 | ||
| 7bis | Jaurès | Bolivar | 0:01 | ||
| 7bis | Louis Blanc | Jaurès | 0:03 | ||
| 7bis | Botzaris | ||||
| 7bis | Place des Fêtes | Botzaris | 0:02 | 1 | |
| 7bis | Pré-Saint-Gervais | Place des Fêtes | 0:02 | 1 | |
| 8 | Balard | ||||
| 8 | Lourmel | Balard | 0:01 | ||
| 8 | Boucicaut | Lourmel | 0:01 | ||
| 8 | Félix Faure | Boucicaut | 0:01 | ||
| 8 | Commerce | Félix Faure | 0:01 | ||
| 8 | La Motte-Picquet–Grenelle | Commerce | 0:01 | ||
| 8 | École Militaire | La Motte-Picquet–Grenelle | 0:02 | ||
| 8 | La Tour-Maubourg | École Militaire | 0:01 | ||
| 8 | Invalides | La Tour-Maubourg | 0:01 | ||
| 8 | Concorde | Invalides | 0:02 | ||
| 8 | Madeleine | Concorde | 0:01 | ||
| 8 | Opéra | Madeleine | 0:02 | ||
| 8 | Richelieu–Drouot | Opéra | 0:01 | ||
| 8 | Grands Boulevards | Richelieu–Drouot | 0:01 | ||
| 8 | Bonne Nouvelle | Grands Boulevards | 0:01 | ||
| 8 | Strasbourg–Saint-Denis | Bonne Nouvelle | 0:01 | ||
| 8 | République | Strasbourg–Saint-Denis | 0:02 | ||
| 8 | Filles du Calvaire | République | 0:01 | ||
| 8 | Saint-Sébastien–Froissart | Filles du Calvaire | 0:01 | ||
| 8 | Chemin Vert | Saint-Sébastien–Froissart | 0:01 | ||
| 8 | Bastille | Chemin Vert | 0:01 | ||
| 8 | Ledru-Rollin | Bastille | 0:02 | ||
| 8 | Faidherbe–Chaligny | Ledru-Rollin | 0:01 | ||
| 8 | Reuilly–Diderot | Faidherbe–Chaligny | 0:01 | ||
| 8 | Montgallet | Reuilly–Diderot | 0:01 | ||
| 8 | Daumesnil | Montgallet | 0:02 | ||
| 8 | Michel Bizot | Daumesnil | 0:01 | ||
| 8 | Porte Dorée | Michel Bizot | 0:01 | ||
| 8 | Porte de Charenton | Porte Dorée | 0:02 | ||
| 8 | Liberté | Porte de Charenton | 0:02 | ||
| 8 | Charenton-Écoles | Liberté | 0:01 | ||
| 8 | École Vétérinaire de Maisons-Alfort | Charenton-Écoles | 0:02 | ||
| 8 | Maisons-Alfort–Stade | École Vétérinaire de Maisons-Alfort | 0:02 | ||
| 8 | Maisons-Alfort–Les Juilliottes | Maisons-Alfort–Stade | 0:02 | ||
| 8 | Créteil–L’Échat | Maisons-Alfort–Les Juilliottes | 0:01 | ||
| 8 | Créteil–Université | Créteil–L’Échat | 0:02 | ||
| 8 | Créteil–Préfecture | Créteil–Université | 0:02 | ||
| 8 | Pointe du Lac | Créteil–Préfecture | 0:03 | ||
| 9 | Pont de Sèvres | Pointe du Lac | |||
| 9 | Billancourt | Pont de Sèvres | 0:01 | ||
| 9 | Marcel Sembat | Billancourt | 0:01 | ||
| 9 | Porte de Saint-Cloud | Marcel Sembat | 0:02 | ||
| 9 | Exelmans | Porte de Saint-Cloud | 0:02 | ||
| 9 | Michel-Ange–Molitor | Exelmans | 0:01 | ||
| 9 | Michel-Ange–Auteuil | Michel-Ange–Molitor | 0:01 | ||
| 9 | Jasmin | Michel-Ange–Auteuil | 0:02 | ||
| 9 | Ranelagh | Jasmin | 0:01 | ||
| 9 | La Muette | Ranelagh | 0:01 | ||
| 9 | Rue de la Pompe | La Muette | 0:02 | ||
| 9 | Trocadéro | Rue de la Pompe | 0:01 | ||
| 9 | Iéna | Trocadéro | 0:01 | ||
| 9 | Alma–Marceau | Iéna | 0:02 | ||
| 9 | Franklin D. Roosevelt | Alma–Marceau | 0:02 | ||
| 9 | Saint-Philippe-du-Roule | Franklin D. Roosevelt | 0:01 | ||
| 9 | Miromesnil | Saint-Philippe-du-Roule | 0:01 | ||
| 9 | Saint-Augustin | Miromesnil | 0:02 | ||
| 9 | Havre–Caumartin | Saint-Augustin | 0:01 | ||
| 9 | Chaussée d’Antin–La Fayette | Havre–Caumartin | 0:01 | ||
| 9 | Richelieu–Drouot | Chaussée d’Antin–La Fayette | 0:01 | ||
| 9 | Grands Boulevards | Richelieu–Drouot | 0:02 | ||
| 9 | Bonne Nouvelle | Grands Boulevards | 0:01 | ||
| 9 | Strasbourg–Saint-Denis | Bonne Nouvelle | 0:01 | ||
| 9 | République | Strasbourg–Saint-Denis | 0:02 | ||
| 9 | Oberkampf | République | 0:01 | ||
| 9 | Saint-Ambroise | Oberkampf | 0:02 | ||
| 9 | Voltaire | Saint-Ambroise | 0:01 | ||
| 9 | Charonne | Voltaire | 0:02 | ||
| 9 | Rue des Boulets | Charonne | 0:01 | ||
| 9 | Nation | Rue des Boulets | 0:01 | ||
| 9 | Buzenval | Nation | 0:02 | ||
| 9 | Maraîchers | Buzenval | 0:01 | ||
| 9 | Porte de Montreuil | Maraîchers | 0:01 | ||
| 9 | Robespierre | Porte de Montreuil | 0:02 | ||
| 9 | Croix de Chavaux | Robespierre | 0:02 | ||
| 9 | Mairie de Montreuil | Croix de Chavaux | 0:03 | ||
| 10 | Boulogne–Pont de Saint-Cloud | ||||
| 10 | Boulogne–Jean Jaurès | Boulogne–Pont de Saint-Cloud | 0:01 | ||
| 10 | Porte d’Auteuil | Boulogne–Jean Jaurès | 0:03 | 1 | |
| 10 | Michel-Ange–Auteuil | Porte d’Auteuil | 0:01 | 1 | |
| 10 | Église d’Auteuil | Michel-Ange–Auteuil | 0:01 | 1 | |
| 10 | Javel–André Citroën | Église d’Auteuil | 0:01 | 1 | |
| 10 | Charles Michels | Javel–André Citroën | 0:02 | ||
| 10 | Avenue Émile Zola | Charles Michels | 0:01 | ||
| 10 | La Motte-Picquet–Grenelle | Avenue Émile Zola | 0:01 | ||
| 10 | Ségur | La Motte-Picquet–Grenelle | 0:02 | ||
| 10 | Duroc | Ségur | 0:02 | ||
| 10 | Vaneau | Duroc | 0:01 | ||
| 10 | Sèvres–Babylone | Vaneau | 0:01 | ||
| 10 | Mabillon | Sèvres–Babylone | 0:02 | ||
| 10 | Odéon | Mabillon | 0:01 | ||
| 10 | Cluny–La Sorbonne | Odéon | 0:01 | ||
| 10 | Maubert–Mutualité | Cluny–La Sorbonne | 0:01 | ||
| 10 | Cardinal Lemoine | Maubert–Mutualité | 0:01 | ||
| 10 | Jussieu | Cardinal Lemoine | 0:02 | ||
| 10 | Gare d’Austerlitz | Jussieu | 0:03 | ||
| 10 | Boulogne–Jean Jaurès | ||||
| 10 | Michel-Ange–Molitor | Boulogne–Jean Jaurès | 0:02 | -1 | |
| 10 | Chardon–Lagache | Michel-Ange–Molitor | 0:01 | -1 | |
| 10 | Mirabeau | Chardon–Lagache | 0:03 | -1 | |
| 10 | Javel–André Citroën | Mirabeau | 0:01 | -1 | |
| 11 | Mairie des Lilas | ||||
| 11 | Porte des Lilas | Mairie des Lilas | 0:01 | ||
| 11 | Télégraphe | Porte des Lilas | 0:01 | ||
| 11 | Place des Fêtes | Télégraphe | 0:01 | ||
| 11 | Jourdain | Place des Fêtes | 0:01 | ||
| 11 | Pyrénées | Jourdain | 0:01 | ||
| 11 | Belleville | Pyrénées | 0:02 | ||
| 11 | Goncourt | Belleville | 0:01 | ||
| 11 | République | Goncourt | 0:01 | ||
| 11 | Arts et Métiers | République | 0:02 | ||
| 11 | Rambuteau | Arts et Métiers | 0:01 | ||
| 11 | Hôtel de Ville | Rambuteau | 0:02 | ||
| 11 | Châtelet | Hôtel de Ville | 0:02 | ||
| 12 | Mairie d’Issy | ||||
| 12 | Corentin Celton | Mairie d’Issy | 0:01 | ||
| 12 | Porte de Versailles | Corentin Celton | 0:01 | ||
| 12 | Convention | Porte de Versailles | 0:02 | ||
| 12 | Vaugirard | Convention | 0:01 | ||
| 12 | Volontaires | Vaugirard | 0:02 | ||
| 12 | Pasteur | Volontaires | 0:01 | ||
| 12 | Falguière | Pasteur | 0:01 | ||
| 12 | Montparnasse–Bienvenüe | Falguière | 0:01 | ||
| 12 | Notre-Dame-des-Champs | Montparnasse–Bienvenüe | 0:02 | ||
| 12 | Rennes | Notre-Dame-des-Champs | 0:01 | ||
| 12 | Sèvres–Babylone | Rennes | 0:01 | ||
| 12 | Rue du Bac | Sèvres–Babylone | 0:01 | ||
| 12 | Solférino | Rue du Bac | 0:01 | ||
| 12 | Assemblée Nationale | Solférino | 0:01 | ||
| 12 | Concorde | Assemblée Nationale | 0:02 | ||
| 12 | Madeleine | Concorde | 0:01 | ||
| 12 | Saint-Lazare | Madeleine | 0:02 | ||
| 12 | Trinité–D’Estienne d’Orves | Saint-Lazare | 0:01 | ||
| 12 | Notre-Dame-de-Lorette | Trinité–D’Estienne d’Orves | 0:01 | ||
| 12 | Saint-Georges | Notre-Dame-de-Lorette | 0:02 | ||
| 12 | Pigalle | Saint-Georges | 0:01 | ||
| 12 | Abbesses | Pigalle | 0:01 | ||
| 12 | Lamark–Caulaincourt | Abbesses | 0:01 | ||
| 12 | Jules Joffrin | Lamark–Caulaincourt | 0:02 | ||
| 12 | Marcadet–Poissonniers | Jules Joffrin | 0:01 | ||
| 12 | Marx Dormoy | Marcadet–Poissonniers | 0:02 | ||
| 12 | Porte de la Chapelle | Marx Dormoy | 0:03 | ||
| 13 | Châtillon–Montrouge | ||||
| 13 | Malakoff–Rue Étienne Dolet | Châtillon–Montrouge | 0:02 | ||
| 13 | Malakoff–Plateau de Vanves | Malakoff–Rue Étienne Dolet | 0:02 | ||
| 13 | Porte de Vanves | Malakoff–Plateau de Vanves | 0:01 | ||
| 13 | Plaisance | Porte de Vanves | 0:02 | ||
| 13 | Pernety | Plaisance | 0:01 | ||
| 13 | Gaîté | Pernety | 0:02 | ||
| 13 | Montparnasse–Bienvenüe | Gaîté | 0:01 | ||
| 13 | Duroc | Montparnasse–Bienvenüe | 0:02 | ||
| 13 | Saint-François-Xavier | Duroc | 0:01 | ||
| 13 | Varenne | Saint-François-Xavier | 0:01 | ||
| 13 | Invalides | Varenne | 0:01 | ||
| 13 | Champs Élysées–Clemenceau | Invalides | 0:02 | ||
| 13 | Miromesnil | Champs Élysées–Clemenceau | 0:02 | ||
| 13 | Saint-Lazare | Miromesnil | 0:02 | ||
| 13 | Liège | Saint-Lazare | 0:02 | ||
| 13 | Place de Clichy | Liège | 0:02 | ||
| 13 | La Fourche | Place de Clichy | 0:01 | ||
| 13 | Brochant | La Fourche | 0:02 | ||
| 13 | Porte de Clichy | Brochant | 0:02 | ||
| 13 | Mairie de Clichy | Porte de Clichy | 0:01 | ||
| 13 | Gabriel Péri | Mairie de Clichy | 0:03 | ||
| 13 | Les Agnettes | Gabriel Péri | 0:02 | ||
| 13 | Asnières–Gennevilliers - Les Courtilles | Les Agnettes | 0:03 | ||
| 13 | La Fourche | ||||
| 13 | Guy Môquet | La Fourche | 0:02 | ||
| 13 | Porte de Saint-Ouen | Guy Môquet | 0:01 | ||
| 13 | Garibaldi | Porte de Saint-Ouen | 0:02 | ||
| 13 | Mairie de Saint-Ouen | Garibaldi | 0:02 | ||
| 13 | Carrefour Pleyel | Mairie de Saint-Ouen | 0:02 | ||
| 13 | Saint-Denis–Porte de Paris | Carrefour Pleyel | 0:02 | ||
| 13 | Basilique de Saint-Denis | Saint-Denis–Porte de Paris | 0:01 | ||
| 13 | Saint-Denis–Université | Basilique de Saint-Denis | 0:03 | ||
| 14 | Saint-Lazare | ||||
| 14 | Madeleine | Saint-Lazare | 0:01 | ||
| 14 | Pyramides | Madeleine | 0:02 | ||
| 14 | Châtelet | Pyramides | 0:02 | ||
| 14 | Gare de Lyon | Châtelet | 0:03 | ||
| 14 | Bercy | Gare de Lyon | 0:02 | ||
| 14 | Cour Saint-Émilion | Bercy | 0:01 | ||
| 14 | Bibliothèque François Mitterrand | Cour Saint-Émilion | 0:02 | ||
| 14 | Olympiades | Bibliothèque François Mitterrand | 0:02 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ❯ zig run build-nodes.zig | |
| { (200-Strasbourg–Saint-Denis), (21-Porte Maillot), (275-Rambuteau), (297-Châtillon–Montrouge), (231-Iéna), (277-Corentin Celton), (93-Saint-Placide ), (29-Père Lachaise ), (56-Temple), (25-La Défense), (38-Anvers), (85-Réaumur–Sébastopol ), (148-Crimée ), (203-Saint-Sébastien–Froissart), (14-Tuileries), (90-Odéon ), (240-Voltaire), (280-Vaugirard), (303-Gaîté), (320-Saint-Denis–Porte de Paris), (272-Pyrénées), (254-Charles Michels), (182-Buttes Chaumont), (184-Louis Blanc), (181-Botzaris), (108-Jaurès), (28-Philippe Auguste), (99-Alésia), (126-Nationale), (169-Maison Blanche), (5-Nation), (173-Pierre et Marie Curie), (237-Chaussée d’Antin–La Fayette), (0-Start), (238-Oberkampf), (34-Jaurès), (119-Picpus), (291-Saint-Georges), (263-Maubert–Mutualité), (248-Mairie de Montreuil), (98-Mouton-Duvernet), (142-Charles de Gaulle Etoile), (314-Asnières–Gennevilliers - Les Courtilles), (197-Richelieu–Drouot), (51-Gambetta), (39-Pigalle), (86-Étienne Marcel), (208-Michel Bizot), (242-Rue des Boulets), (287-Solférino), (116-Saint-Marcel ), (127-Corvisart), (158-Palais-Royal–Musée du Louvre ), (152-Château Landon ), (167-Place d’Italie ), (224-Exelmans), (294-Jules Joffrin), (191-La Motte-Picquet–Grenelle), (120-Bel Air), (177-Villejuif–P. Vaillant-Couturier), (235-Saint-Augustin), (205-Ledru-Rollin), (19-Charles de Gaulle Etoile ), (131-Edgar Quinet ), (211-Liberté), (278-Porte de Versailles), (175-Le Kremlin-Bicêtre), (258-Vaneau), (36-La Chapelle ), (41-Place de Clichy), (64-Saint-Lazare), (151-Louis Blanc ), (309-Brochant), (114-Quai de la Rapée ), (170-Porte d’Italie), (292-Abbesses), (316-Porte de Saint-Ouen), (104-Hoche), (143-La Courneuve–8 mai 1945), (138-Passy), (255-Avenue Émile Zola), (52-Père Lachaise ), (241-Charonne), (268-Mirabeau), (62-Opéra ), (159-Pont Neuf ), (310-Porte de Clichy), (323-Pyramides), (279-Convention), (147-Corentin Cariou ), (9-Saint-Paul), (80-Barbès–Rochechouart ), (180-Danube), (133-Sèvres–Lecourbe ), (286-Rue du Bac), (232-Alma–Marceau), (72-Pont de Levallois), (194-Invalides), (312-Gabriel Péri), (15-Concorde), (179-Pré-Saint-Gervais), (102-Bobigny-Pantin–Raymond ), (189-Félix Faure), (88-Cité), (176-Villejuif–Léo Lagrange), (218-Créteil–Préfecture), (45-Courcelles), (61-Quatre-Septembre ), (259-Sèvres–Babylone), (298-Malakoff–Rue Étienne Dolet), (313-Les Agnettes), (250-Boulogne–Jean Jaurès), (2-Bérault), (305-Varenne), (236-Havre–Caumartin), (299-Malakoff–Plateau de Vanves), (110-Jacques Bonsergent ), (201-République), (8-Bastille), (172-Porte d’Ivry), (204-Chemin Vert), (326-Olympiades), (3-Saint-Mandé–Tourelle), (168-Tolbiac ), (202-Filles du Calvaire), (105-Porte de Pantin), (69-Porte de Champerret ), (157-Pyramides ), (113-Bréguet-Sabin ), (115-Gare d’Austerlitz ), (150-Stalingrad ), (244-Maraîchers), (253-Javel–André Citroën), (60-Bourse ), (160-Châtelet ), (270-Télégraphe), (276-Mairie d’Issy), (284-Notre-Dame-des-Champs), (46-Ternes), (318-Mairie de Saint-Ouen), (50-Porte de Bagnolet ), (311-Mairie de Clichy), (135-La Motte-Picquet–Grenelle ), (317-Garibaldi), (265-Jussieu), (76-Porte de Clignancourt), (118-Place d’Italie), (252-Église d’Auteuil), (43-Villiers), (174-Mairie d’ Ivry), (245-Porte de Montreuil), (199-Bonne Nouvelle), (20-Argentine), (247-Croix de Chavaux), (216-Créteil–L’Échat), (106-Ourcq), (48-Porte Dauphine), (49-Gallieni), (136-Dupleix), (207-Montgallet), (83-Château d’Eau ), (101-Bobigny–Pablo Picasso), (6-Reuilly–Diderot), (18-George V), (47-Victor Hugo), (67-Wagram), (162-Sully–Morland ), (234-Miromesnil), (249-Boulogne–Pont de Saint-Cloud), (188-Boucicaut), (26-Avron), (74-Saint-Fargeau ), (30-Ménilmontant ), (68-Pereire), (306-Champs Élysées–Clemenceau), (319-Carrefour Pleyel), (10-Hôtel de Ville), (164-Place Monge ), (57-Arts et Métiers ), (96-Raspail ), (230-Rue de la Pompe), (82-Gare de l’Est), (149-Riquet ), (65-Europe), (215-Maisons-Alfort–Les Juilliottes ), (95-Vavin), (140-Boissière), (24-Esplanade de La Défense), (210-Porte de Charenton), (212-Charenton-Écoles), (293-Lamark–Caulaincourt), (79-Château Rouge ), (121-Daumesnil), (186-Balard), (91-Saint-Germain-des-Prés ), (285-Rennes), (107-Laumière), (239-Saint-Ambroise), (161-Pont Marie ), (321-Basilique de Saint-Denis), (156-Chaussée d’Antin–La Fayette ), (257-Duroc), (273-Goncourt), (271-Jourdain), (112-Richard-Lenoir ), (296-Porte de la Chapelle), (92-Saint-Sulpice ), (228-Ranelagh), (58-Réaumur-Sébastopol ), (137-Bir-Hakeim), (214-Maisons-Alfort–Stade), (243-Buzenval), (256-Ségur), (139-Trocadéro), (53-Rue Saint-Maur ), (192-École Militaire), (282-Falguière), (307-Liège), (35-Stalingrad), (213-École Vétérinaire de Maisons-Alfort ), (75-Pelleport ), (94-Montparnasse–Bienvenüe ), (27-Alexandre Dumas ), (32-Belleville), (63-Havre-Caumartin ), (301-Plaisance), (187-Lourmel), (44-Monceau), (261-Odéon), (193-La Tour-Maubourg), (81-Gare du Nord), (229-La Muette), (295-Marx Dormoy), (22-Les Sablons), (302-Pernety), (77-Simplon), (222-Marcel Sembat), (300-Porte de Vanves), (233-Saint-Philippe-du-Roule), (42-Rome), (130-Raspail), (198-Grands Boulevards), (11-Châtelet), (87-Les Halles), (100-Porte d’Orléans), (145-Aubervilliers–Pantin–Q. Chemins ), (246-Robespierre), (141-Kléber), (225-Michel-Ange–Molitor), (290-Notre-Dame-de-Lorette), (40-Blanche), (219-Pointe du Lac), (223-Porte de Saint-Cloud), (73-Porte des Lilas), (190-Commerce), (322-Saint-Denis–Université), (165-Censier–Daubenton ), (4-Porte de Vincennes), (153-Poissonnière ), (283-Montparnasse–Bienvenüe), (267-Chardon–Lagache), (89-Saint-Michel), (185-Place des Fêtes), (227-Jasmin), (66-Malesherbes ), (178-Villejuif–Louis Aragon), (264-Cardinal Lemoine), (266-Gare d’Austerlitz), (132-Pasteur), (55-République ), (260-Mabillon), (154-Cadet ), (146-Porte de la Villette ), (16-Champs Élysées–Clemenceau ), (23-Pont de Neuilly), (269-Mairie des Lilas), (166-Les Gobelins ), (221-Billancourt), (304-Saint-François-Xavier), (123-Bercy), (325-Bibliothèque François Mitterrand), (78-Marcadet–Poissonniers), (17-Franklin D. Roosevelt), (220-Pont de Sèvres), (274-Arts et Métiers), (103-Queneau Église de Pantin), (37-Barbès-Rochechouart ), (155-Le Peletier ), (251-Porte d’Auteuil), (262-Cluny–La Sorbonne), (31-Couronnes), (134-Cambronne), (195-Madeleine), (315-Guy Môquet), (206-Faidherbe–Chaligny), (226-Michel-Ange–Auteuil), (171-Porte de Choisy), (288-Assemblée Nationale), (129-Saint-Jacques ), (289-Trinité–D’Estienne d’Orves), (196-Opéra), (209-Porte Dorée), (54-Parmentier ), (7-Gare de Lyon), (59-Sentier), (33-Colonel Fabien), (71-Anatole France), (122-Dugommier), (183-Bolivar), (281-Volontaires), (324-Cour Saint-Émilion), (144-Fort d’Aubervilliers ), (109-Gare de l’Est ), (84-Strasbourg–Saint-Denis ), (13-Palais Royal–Musée du Louvre ), (111-Oberkampf ), (1-Château de Vincennes), (70-Louise Michel ), (97-Denfert-Rochereau ), (124-Quai de la Gare ), (163-Jussieu ), (12-Louvre–Rivoli), (308-La Fourche), (117-Campo-Formio ), (217-Créteil–Université), (128-Glacière), (125-Chevaleret) } | |
| { Edge{ .start = 2, .end = 1, .cost = 1 }, Edge{ .start = 1, .end = 2, .cost = 1 }, Edge{ .start = 3, .end = 2, .cost = 1 }, Edge{ .start = 2, .end = 3, .cost = 1 }, Edge{ .start = 4, .end = 3, .cost = 1 }, Edge{ .start = 3, .end = 4, .cost = 1 }, Edge{ .start = 5, .end = 4, .cost = 2 }, Edge{ .start = 4, .end = 5, .cost = 2 }, Edge{ .start = 6, .end = 5, .cost = 2 }, Edge{ .start = 5, .end = 6, .cost = 2 }, Edge{ .start = 7, .end = 6, .cost = 1 }, Edge{ .start = 6, .end = 7, .cost = 1 }, Edge{ .start = 8, .end = 7, .cost = 2 }, Edge{ .start = 7, .end = 8, .cost = 2 }, Edge{ .start = 9, .end = 8, .cost = 2 }, Edge{ .start = 8, .end = 9, .cost = 2 }, Edge{ .start = 10, .end = 9, .cost = 1 }, Edge{ .start = 9, .end = 10, .cost = 1 }, Edge{ .start = 11, .end = 10, .cost = 2 }, Edge{ .start = 10, .end = 11, .cost = 2 }, Edge{ .start = 12, .end = 11, .cost = 1 }, Edge{ .start = 11, .end = 12, .cost = 1 }, Edge{ .start = 13, .end = 12, .cost = 1 }, Edge{ .start = 12, .end = 13, .cost = 1 }, Edge{ .start = 14, .end = 13, .cost = 1 }, Edge{ .start = 13, .end = 14, .cost = 1 }, Edge{ .start = 15, .end = 14, .cost = 1 }, Edge{ .start = 14, .end = 15, .cost = 1 }, Edge{ .start = 16, .end = 15, .cost = 2 }, Edge{ .start = 15, .end = 16, .cost = 2 }, Edge{ .start = 17, .end = 16, .cost = 2 }, Edge{ .start = 16, .end = 17, .cost = 2 }, Edge{ .start = 18, .end = 17, .cost = 1 }, Edge{ .start = 17, .end = 18, .cost = 1 }, Edge{ .start = 19, .end = 18, .cost = 1 }, Edge{ .start = 18, .end = 19, .cost = 1 }, Edge{ .start = 20, .end = 19, .cost = 2 }, Edge{ .start = 19, .end = 20, .cost = 2 }, Edge{ .start = 21, .end = 20, .cost = 1 }, Edge{ .start = 20, .end = 21, .cost = 1 }, Edge{ .start = 22, .end = 21, .cost = 2 }, Edge{ .start = 21, .end = 22, .cost = 2 }, Edge{ .start = 23, .end = 22, .cost = 1 }, Edge{ .start = 22, .end = 23, .cost = 1 }, Edge{ .start = 24, .end = 23, .cost = 2 }, Edge{ .start = 23, .end = 24, .cost = 2 }, Edge{ .start = 25, .end = 24, .cost = 2 }, Edge{ .start = 24, .end = 25, .cost = 2 }, Edge{ .start = 26, .end = 5, .cost = 1 }, Edge{ .start = 5, .end = 26, .cost = 1 }, Edge{ .start = 27, .end = 26, .cost = 1 }, Edge{ .start = 26, .end = 27, .cost = 1 }, Edge{ .start = 28, .end = 27, .cost = 1 }, Edge{ .start = 27, .end = 28, .cost = 1 }, Edge{ .start = 29, .end = 28, .cost = 2 }, Edge{ .start = 28, .end = 29, .cost = 2 }, Edge{ .start = 30, .end = 29, .cost = 1 }, Edge{ .start = 29, .end = 30, .cost = 1 }, Edge{ .start = 31, .end = 30, .cost = 1 }, Edge{ .start = 30, .end = 31, .cost = 1 }, Edge{ .start = 32, .end = 31, .cost = 1 }, Edge{ .start = 31, .end = 32, .cost = 1 }, Edge{ .start = 33, .end = 32, .cost = 2 }, Edge{ .start = 32, .end = 33, .cost = 2 }, Edge{ .start = 34, .end = 33, .cost = 1 }, Edge{ .start = 33, .end = 34, .cost = 1 }, Edge{ .start = 35, .end = 34, .cost = 2 }, Edge{ .start = 34, .end = 35, .cost = 2 }, Edge{ .start = 36, .end = 35, .cost = 1 }, Edge{ .start = 35, .end = 36, .cost = 1 }, Edge{ .start = 37, .end = 36, .cost = 2 }, Edge{ .start = 36, .end = 37, .cost = 2 }, Edge{ .start = 38, .end = 37, .cost = 1 }, Edge{ .start = 37, .end = 38, .cost = 1 }, Edge{ .start = 39, .end = 38, .cost = 2 }, Edge{ .start = 38, .end = 39, .cost = 2 }, Edge{ .start = 40, .end = 39, .cost = 1 }, Edge{ .start = 39, .end = 40, .cost = 1 }, Edge{ .start = 41, .end = 40, .cost = 2 }, Edge{ .start = 40, .end = 41, .cost = 2 }, Edge{ .start = 42, .end = 41, .cost = 1 }, Edge{ .start = 41, .end = 42, .cost = 1 }, Edge{ .start = 43, .end = 42, .cost = 2 }, Edge{ .start = 42, .end = 43, .cost = 2 }, Edge{ .start = 44, .end = 43, .cost = 1 }, Edge{ .start = 43, .end = 44, .cost = 1 }, Edge{ .start = 45, .end = 44, .cost = 1 }, Edge{ .start = 44, .end = 45, .cost = 1 }, Edge{ .start = 46, .end = 45, .cost = 2 }, Edge{ .start = 45, .end = 46, .cost = 2 }, Edge{ .start = 19, .end = 46, .cost = 1 }, Edge{ .start = 46, .end = 19, .cost = 1 }, Edge{ .start = 47, .end = 19, .cost = 2 }, Edge{ .start = 19, .end = 47, .cost = 2 }, Edge{ .start = 48, .end = 47, .cost = 3 }, Edge{ .start = 47, .end = 48, .cost = 3 }, Edge{ .start = 50, .end = 49, .cost = 1 }, Edge{ .start = 49, .end = 50, .cost = 1 }, Edge{ .start = 51, .end = 50, .cost = 1 }, Edge{ .start = 50, .end = 51, .cost = 1 }, Edge{ .start = 52, .end = 51, .cost = 2 }, Edge{ .start = 51, .end = 52, .cost = 2 }, Edge{ .start = 53, .end = 52, .cost = 1 }, Edge{ .start = 52, .end = 53, .cost = 1 }, Edge{ .start = 54, .end = 53, .cost = 1 }, Edge{ .start = 53, .end = 54, .cost = 1 }, Edge{ .start = 55, .end = 54, .cost = 2 }, Edge{ .start = 54, .end = 55, .cost = 2 }, Edge{ .start = 56, .end = 55, .cost = 1 }, Edge{ .start = 55, .end = 56, .cost = 1 }, Edge{ .start = 57, .end = 56, .cost = 1 }, Edge{ .start = 56, .end = 57, .cost = 1 }, Edge{ .start = 58, .end = 57, .cost = 1 }, Edge{ .start = 57, .end = 58, .cost = 1 }, Edge{ .start = 59, .end = 58, .cost = 1 }, Edge{ .start = 58, .end = 59, .cost = 1 }, Edge{ .start = 60, .end = 59, .cost = 2 }, Edge{ .start = 59, .end = 60, .cost = 2 }, Edge{ .start = 61, .end = 60, .cost = 1 }, Edge{ .start = 60, .end = 61, .cost = 1 }, Edge{ .start = 62, .end = 61, .cost = 1 }, Edge{ .start = 61, .end = 62, .cost = 1 }, Edge{ .start = 63, .end = 62, .cost = 1 }, Edge{ .start = 62, .end = 63, .cost = 1 }, Edge{ .start = 64, .end = 63, .cost = 1 }, Edge{ .start = 63, .end = 64, .cost = 1 }, Edge{ .start = 65, .end = 64, .cost = 2 }, Edge{ .start = 64, .end = 65, .cost = 2 }, Edge{ .start = 43, .end = 65, .cost = 1 }, Edge{ .start = 65, .end = 43, .cost = 1 }, Edge{ .start = 66, .end = 43, .cost = 2 }, Edge{ .start = 43, .end = 66, .cost = 2 }, Edge{ .start = 67, .end = 66, .cost = 1 }, Edge{ .start = 66, .end = 67, .cost = 1 }, Edge{ .start = 68, .end = 67, .cost = 1 }, Edge{ .start = 67, .end = 68, .cost = 1 }, Edge{ .start = 69, .end = 68, .cost = 1 }, Edge{ .start = 68, .end = 69, .cost = 1 }, Edge{ .start = 70, .end = 69, .cost = 1 }, Edge{ .start = 69, .end = 70, .cost = 1 }, Edge{ .start = 71, .end = 70, .cost = 2 }, Edge{ .start = 70, .end = 71, .cost = 2 }, Edge{ .start = 72, .end = 71, .cost = 2 }, Edge{ .start = 71, .end = 72, .cost = 2 }, Edge{ .start = 74, .end = 73, .cost = 1 }, Edge{ .start = 73, .end = 74, .cost = 1 }, Edge{ .start = 75, .end = 74, .cost = 1 }, Edge{ .start = 74, .end = 75, .cost = 1 }, Edge{ .start = 51, .end = 75, .cost = 1 }, Edge{ .start = 75, .end = 51, .cost = 1 }, Edge{ .start = 77, .end = 76, .cost = 1 }, Edge{ .start = 76, .end = 77, .cost = 1 }, Edge{ .start = 78, .end = 77, .cost = 1 }, Edge{ .start = 77, .end = 78, .cost = 1 }, Edge{ .start = 79, .end = 78, .cost = 1 }, Edge{ .start = 78, .end = 79, .cost = 1 }, Edge{ .start = 80, .end = 79, .cost = 1 }, Edge{ .start = 79, .end = 80, .cost = 1 }, Edge{ .start = 81, .end = 80, .cost = 2 }, Edge{ .start = 80, .end = 81, .cost = 2 }, Edge{ .start = 82, .end = 81, .cost = 2 }, Edge{ .start = 81, .end = 82, .cost = 2 }, Edge{ .start = 83, .end = 82, .cost = 1 }, Edge{ .start = 82, .end = 83, .cost = 1 }, Edge{ .start = 84, .end = 83, .cost = 1 }, Edge{ .start = 83, .end = 84, .cost = 1 }, Edge{ .start = 85, .end = 84, .cost = 1 }, Edge{ .start = 84, .end = 85, .cost = 1 }, Edge{ .start = 86, .end = 85, .cost = 2 }, Edge{ .start = 85, .end = 86, .cost = 2 }, Edge{ .start = 87, .end = 86, .cost = 1 }, Edge{ .start = 86, .end = 87, .cost = 1 }, Edge{ .start = 11, .end = 87, .cost = 1 }, Edge{ .start = 87, .end = 11, .cost = 1 }, Edge{ .start = 88, .end = 11, .cost = 2 }, Edge{ .start = 11, .end = 88, .cost = 2 }, Edge{ .start = 89, .end = 88, .cost = 1 }, Edge{ .start = 88, .end = 89, .cost = 1 }, Edge{ .start = 90, .end = 89, .cost = 1 }, Edge{ .start = 89, .end = 90, .cost = 1 }, Edge{ .start = 91, .end = 90, .cost = 1 }, Edge{ .start = 90, .end = 91, .cost = 1 }, Edge{ .start = 92, .end = 91, .cost = 1 }, Edge{ .start = 91, .end = 92, .cost = 1 }, Edge{ .start = 93, .end = 92, .cost = 2 }, Edge{ .start = 92, .end = 93, .cost = 2 }, Edge{ .start = 94, .end = 93, .cost = 1 }, Edge{ .start = 93, .end = 94, .cost = 1 }, Edge{ .start = 95, .end = 94, .cost = 1 }, Edge{ .start = 94, .end = 95, .cost = 1 }, Edge{ .start = 96, .end = 95, .cost = 2 }, Edge{ .start = 95, .end = 96, .cost = 2 }, Edge{ .start = 97, .end = 96, .cost = 1 }, Edge{ .start = 96, .end = 97, .cost = 1 }, Edge{ .start = 98, .end = 97, .cost = 1 }, Edge{ .start = 97, .end = 98, .cost = 1 }, Edge{ .start = 99, .end = 98, .cost = 1 }, Edge{ .start = 98, .end = 99, .cost = 1 }, Edge{ .start = 100, .end = 99, .cost = 2 }, Edge{ .start = 99, .end = 100, .cost = 2 }, Edge{ .start = 102, .end = 101, .cost = 3 }, Edge{ .start = 101, .end = 102, .cost = 3 }, Edge{ .start = 103, .end = 102, .cost = 2 }, Edge{ .start = 102, .end = 103, .cost = 2 }, Edge{ .start = 104, .end = 103, .cost = 1 }, Edge{ .start = 103, .end = 104, .cost = 1 }, Edge{ .start = 105, .end = 104, .cost = 2 }, Edge{ .start = 104, .end = 105, .cost = 2 }, Edge{ .start = 106, .end = 105, .cost = 1 }, Edge{ .start = 105, .end = 106, .cost = 1 }, Edge{ .start = 107, .end = 106, .cost = 1 }, Edge{ .start = 106, .end = 107, .cost = 1 }, Edge{ .start = 108, .end = 107, .cost = 2 }, Edge{ .start = 107, .end = 108, .cost = 2 }, Edge{ .start = 35, .end = 108, .cost = 1 }, Edge{ .start = 108, .end = 35, .cost = 1 }, Edge{ .start = 81, .end = 35, .cost = 2 }, Edge{ .start = 35, .end = 81, .cost = 2 }, Edge{ .start = 109, .end = 81, .cost = 3 }, Edge{ .start = 81, .end = 109, .cost = 3 }, Edge{ .start = 110, .end = 109, .cost = 2 }, Edge{ .start = 109, .end = 110, .cost = 2 }, Edge{ .start = 55, .end = 110, .cost = 1 }, Edge{ .start = 110, .end = 55, .cost = 1 }, Edge{ .start = 111, .end = 55, .cost = 2 }, Edge{ .start = 55, .end = 111, .cost = 2 }, Edge{ .start = 112, .end = 111, .cost = 1 }, Edge{ .start = 111, .end = 112, .cost = 1 }, Edge{ .start = 113, .end = 112, .cost = 2 }, Edge{ .start = 112, .end = 113, .cost = 2 }, Edge{ .start = 8, .end = 113, .cost = 1 }, Edge{ .start = 113, .end = 8, .cost = 1 }, Edge{ .start = 114, .end = 8, .cost = 2 }, Edge{ .start = 8, .end = 114, .cost = 2 }, Edge{ .start = 115, .end = 114, .cost = 2 }, Edge{ .start = 114, .end = 115, .cost = 2 }, Edge{ .start = 116, .end = 115, .cost = 1 }, Edge{ .start = 115, .end = 116, .cost = 1 }, Edge{ .start = 117, .end = 116, .cost = 1 }, Edge{ .start = 116, .end = 117, .cost = 1 }, Edge{ .start = 118, .end = 117, .cost = 4 }, Edge{ .start = 117, .end = 118, .cost = 4 }, Edge{ .start = 119, .end = 5, .cost = 1 }, Edge{ .start = 5, .end = 119, .cost = 1 }, Edge{ .start = 120, .end = 119, .cost = 1 }, Edge{ .start = 119, .end = 120, .cost = 1 }, Edge{ .start = 121, .end = 120, .cost = 1 }, Edge{ .start = 120, .end = 121, .cost = 1 }, Edge{ .start = 122, .end = 121, .cost = 1 }, Edge{ .start = 121, .end = 122, .cost = 1 }, Edge{ .start = 123, .end = 122, .cost = 1 }, Edge{ .start = 122, .end = 123, .cost = 1 }, Edge{ .start = 124, .end = 123, .cost = 2 }, Edge{ .start = 123, .end = 124, .cost = 2 }, Edge{ .start = 125, .end = 124, .cost = 1 }, Edge{ .start = 124, .end = 125, .cost = 1 }, Edge{ .start = 126, .end = 125, .cost = 1 }, Edge{ .start = 125, .end = 126, .cost = 1 }, Edge{ .start = 118, .end = 126, .cost = 1 }, Edge{ .start = 126, .end = 118, .cost = 1 }, Edge{ .start = 127, .end = 118, .cost = 1 }, Edge{ .start = 118, .end = 127, .cost = 1 }, Edge{ .start = 128, .end = 127, .cost = 2 }, Edge{ .start = 127, .end = 128, .cost = 2 }, Edge{ .start = 129, .end = 128, .cost = 1 }, Edge{ .start = 128, .end = 129, .cost = 1 }, Edge{ .start = 97, .end = 129, .cost = 1 }, Edge{ .start = 129, .end = 97, .cost = 1 }, Edge{ .start = 130, .end = 97, .cost = 1 }, Edge{ .start = 97, .end = 130, .cost = 1 }, Edge{ .start = 131, .end = 130, .cost = 1 }, Edge{ .start = 130, .end = 131, .cost = 1 }, Edge{ .start = 94, .end = 131, .cost = 1 }, Edge{ .start = 131, .end = 94, .cost = 1 }, Edge{ .start = 132, .end = 94, .cost = 2 }, Edge{ .start = 94, .end = 132, .cost = 2 }, Edge{ .start = 133, .end = 132, .cost = 1 }, Edge{ .start = 132, .end = 133, .cost = 1 }, Edge{ .start = 134, .end = 133, .cost = 1 }, Edge{ .start = 133, .end = 134, .cost = 1 }, Edge{ .start = 135, .end = 134, .cost = 1 }, Edge{ .start = 134, .end = 135, .cost = 1 }, Edge{ .start = 136, .end = 135, .cost = 2 }, Edge{ .start = 135, .end = 136, .cost = 2 }, Edge{ .start = 137, .end = 136, .cost = 1 }, Edge{ .start = 136, .end = 137, .cost = 1 }, Edge{ .start = 138, .end = 137, .cost = 1 }, Edge{ .start = 137, .end = 138, .cost = 1 }, Edge{ .start = 139, .end = 138, .cost = 1 }, Edge{ .start = 138, .end = 139, .cost = 1 }, Edge{ .start = 140, .end = 139, .cost = 1 }, Edge{ .start = 139, .end = 140, .cost = 1 }, Edge{ .start = 141, .end = 140, .cost = 2 }, Edge{ .start = 140, .end = 141, .cost = 2 }, Edge{ .start = 142, .end = 141, .cost = 2 }, Edge{ .start = 141, .end = 142, .cost = 2 }, Edge{ .start = 144, .end = 143, .cost = 1 }, Edge{ .start = 143, .end = 144, .cost = 1 }, Edge{ .start = 145, .end = 144, .cost = 2 }, Edge{ .start = 144, .end = 145, .cost = 2 }, Edge{ .start = 146, .end = 145, .cost = 2 }, Edge{ .start = 145, .end = 146, .cost = 2 }, Edge{ .start = 147, .end = 146, .cost = 2 }, Edge{ .start = 146, .end = 147, .cost = 2 }, Edge{ .start = 148, .end = 147, .cost = 1 }, Edge{ .start = 147, .end = 148, .cost = 1 }, Edge{ .start = 149, .end = 148, .cost = 1 }, Edge{ .start = 148, .end = 149, .cost = 1 }, Edge{ .start = 150, .end = 149, .cost = 1 }, Edge{ .start = 149, .end = 150, .cost = 1 }, Edge{ .start = 151, .end = 150, .cost = 2 }, Edge{ .start = 150, .end = 151, .cost = 2 }, Edge{ .start = 152, .end = 151, .cost = 1 }, Edge{ .start = 151, .end = 152, .cost = 1 }, Edge{ .start = 109, .end = 152, .cost = 1 }, Edge{ .start = 152, .end = 109, .cost = 1 }, Edge{ .start = 153, .end = 109, .cost = 2 }, Edge{ .start = 109, .end = 153, .cost = 2 }, Edge{ .start = 154, .end = 153, .cost = 1 }, Edge{ .start = 153, .end = 154, .cost = 1 }, Edge{ .start = 155, .end = 154, .cost = 1 }, Edge{ .start = 154, .end = 155, .cost = 1 }, Edge{ .start = 156, .end = 155, .cost = 2 }, Edge{ .start = 155, .end = 156, .cost = 2 }, Edge{ .start = 62, .end = 156, .cost = 1 }, Edge{ .start = 156, .end = 62, .cost = 1 }, Edge{ .start = 157, .end = 62, .cost = 2 }, Edge{ .start = 62, .end = 157, .cost = 2 }, Edge{ .start = 158, .end = 157, .cost = 1 }, Edge{ .start = 157, .end = 158, .cost = 1 }, Edge{ .start = 159, .end = 158, .cost = 2 }, Edge{ .start = 158, .end = 159, .cost = 2 }, Edge{ .start = 160, .end = 159, .cost = 1 }, Edge{ .start = 159, .end = 160, .cost = 1 }, Edge{ .start = 161, .end = 160, .cost = 2 }, Edge{ .start = 160, .end = 161, .cost = 2 }, Edge{ .start = 162, .end = 161, .cost = 1 }, Edge{ .start = 161, .end = 162, .cost = 1 }, Edge{ .start = 163, .end = 162, .cost = 2 }, Edge{ .start = 162, .end = 163, .cost = 2 }, Edge{ .start = 164, .end = 163, .cost = 1 }, Edge{ .start = 163, .end = 164, .cost = 1 }, Edge{ .start = 165, .end = 164, .cost = 1 }, Edge{ .start = 164, .end = 165, .cost = 1 }, Edge{ .start = 166, .end = 165, .cost = 1 }, Edge{ .start = 165, .end = 166, .cost = 1 }, Edge{ .start = 167, .end = 166, .cost = 2 }, Edge{ .start = 166, .end = 167, .cost = 2 }, Edge{ .start = 168, .end = 167, .cost = 1 }, Edge{ .start = 167, .end = 168, .cost = 1 }, Edge{ .start = 169, .end = 168, .cost = 1 }, Edge{ .start = 168, .end = 169, .cost = 1 }, Edge{ .start = 170, .end = 169, .cost = 2 }, Edge{ .start = 169, .end = 170, .cost = 2 }, Edge{ .start = 171, .end = 170, .cost = 1 }, Edge{ .start = 170, .end = 171, .cost = 1 }, Edge{ .start = 172, .end = 171, .cost = 1 }, Edge{ .start = 171, .end = 172, .cost = 1 }, Edge{ .start = 173, .end = 172, .cost = 2 }, Edge{ .start = 172, .end = 173, .cost = 2 }, Edge{ .start = 174, .end = 173, .cost = 3 }, Edge{ .start = 173, .end = 174, .cost = 3 }, Edge{ .start = 175, .end = 169, .cost = 2 }, Edge{ .start = 169, .end = 175, .cost = 2 }, Edge{ .start = 176, .end = 175, .cost = 1 }, Edge{ .start = 175, .end = 176, .cost = 1 }, Edge{ .start = 177, .end = 176, .cost = 2 }, Edge{ .start = 176, .end = 177, .cost = 2 }, Edge{ .start = 178, .end = 177, .cost = 3 }, Edge{ .start = 177, .end = 178, .cost = 3 }, Edge{ .start = 179, .end = 180, .cost = 1 }, Edge{ .start = 180, .end = 181, .cost = 1 }, Edge{ .start = 182, .end = 181, .cost = 1 }, Edge{ .start = 181, .end = 182, .cost = 1 }, Edge{ .start = 183, .end = 182, .cost = 1 }, Edge{ .start = 182, .end = 183, .cost = 1 }, Edge{ .start = 108, .end = 183, .cost = 1 }, Edge{ .start = 183, .end = 108, .cost = 1 }, Edge{ .start = 184, .end = 108, .cost = 3 }, Edge{ .start = 108, .end = 184, .cost = 3 }, Edge{ .start = 185, .end = 181, .cost = 2 }, Edge{ .start = 179, .end = 185, .cost = 2 }, Edge{ .start = 187, .end = 186, .cost = 1 }, Edge{ .start = 186, .end = 187, .cost = 1 }, Edge{ .start = 188, .end = 187, .cost = 1 }, Edge{ .start = 187, .end = 188, .cost = 1 }, Edge{ .start = 189, .end = 188, .cost = 1 }, Edge{ .start = 188, .end = 189, .cost = 1 }, Edge{ .start = 190, .end = 189, .cost = 1 }, Edge{ .start = 189, .end = 190, .cost = 1 }, Edge{ .start = 191, .end = 190, .cost = 1 }, Edge{ .start = 190, .end = 191, .cost = 1 }, Edge{ .start = 192, .end = 191, .cost = 2 }, Edge{ .start = 191, .end = 192, .cost = 2 }, Edge{ .start = 193, .end = 192, .cost = 1 }, Edge{ .start = 192, .end = 193, .cost = 1 }, Edge{ .start = 194, .end = 193, .cost = 1 }, Edge{ .start = 193, .end = 194, .cost = 1 }, Edge{ .start = 15, .end = 194, .cost = 2 }, Edge{ .start = 194, .end = 15, .cost = 2 }, Edge{ .start = 195, .end = 15, .cost = 1 }, Edge{ .start = 15, .end = 195, .cost = 1 }, Edge{ .start = 196, .end = 195, .cost = 2 }, Edge{ .start = 195, .end = 196, .cost = 2 }, Edge{ .start = 197, .end = 196, .cost = 1 }, Edge{ .start = 196, .end = 197, .cost = 1 }, Edge{ .start = 198, .end = 197, .cost = 1 }, Edge{ .start = 197, .end = 198, .cost = 1 }, Edge{ .start = 199, .end = 198, .cost = 1 }, Edge{ .start = 198, .end = 199, .cost = 1 }, Edge{ .start = 200, .end = 199, .cost = 1 }, Edge{ .start = 199, .end = 200, .cost = 1 }, Edge{ .start = 201, .end = 200, .cost = 2 }, Edge{ .start = 200, .end = 201, .cost = 2 }, Edge{ .start = 202, .end = 201, .cost = 1 }, Edge{ .start = 201, .end = 202, .cost = 1 }, Edge{ .start = 203, .end = 202, .cost = 1 }, Edge{ .start = 202, .end = 203, .cost = 1 }, Edge{ .start = 204, .end = 203, .cost = 1 }, Edge{ .start = 203, .end = 204, .cost = 1 }, Edge{ .start = 8, .end = 204, .cost = 1 }, Edge{ .start = 204, .end = 8, .cost = 1 }, Edge{ .start = 205, .end = 8, .cost = 2 }, Edge{ .start = 8, .end = 205, .cost = 2 }, Edge{ .start = 206, .end = 205, .cost = 1 }, Edge{ .start = 205, .end = 206, .cost = 1 }, Edge{ .start = 6, .end = 206, .cost = 1 }, Edge{ .start = 206, .end = 6, .cost = 1 }, Edge{ .start = 207, .end = 6, .cost = 1 }, Edge{ .start = 6, .end = 207, .cost = 1 }, Edge{ .start = 121, .end = 207, .cost = 2 }, Edge{ .start = 207, .end = 121, .cost = 2 }, Edge{ .start = 208, .end = 121, .cost = 1 }, Edge{ .start = 121, .end = 208, .cost = 1 }, Edge{ .start = 209, .end = 208, .cost = 1 }, Edge{ .start = 208, .end = 209, .cost = 1 }, Edge{ .start = 210, .end = 209, .cost = 2 }, Edge{ .start = 209, .end = 210, .cost = 2 }, Edge{ .start = 211, .end = 210, .cost = 2 }, Edge{ .start = 210, .end = 211, .cost = 2 }, Edge{ .start = 212, .end = 211, .cost = 1 }, Edge{ .start = 211, .end = 212, .cost = 1 }, Edge{ .start = 213, .end = 212, .cost = 2 }, Edge{ .start = 212, .end = 213, .cost = 2 }, Edge{ .start = 214, .end = 213, .cost = 2 }, Edge{ .start = 213, .end = 214, .cost = 2 }, Edge{ .start = 215, .end = 214, .cost = 2 }, Edge{ .start = 214, .end = 215, .cost = 2 }, Edge{ .start = 216, .end = 215, .cost = 1 }, Edge{ .start = 215, .end = 216, .cost = 1 }, Edge{ .start = 217, .end = 216, .cost = 2 }, Edge{ .start = 216, .end = 217, .cost = 2 }, Edge{ .start = 218, .end = 217, .cost = 2 }, Edge{ .start = 217, .end = 218, .cost = 2 }, Edge{ .start = 219, .end = 218, .cost = 3 }, Edge{ .start = 218, .end = 219, .cost = 3 }, Edge{ .start = 220, .end = 219, .cost = 0 }, Edge{ .start = 219, .end = 220, .cost = 0 }, Edge{ .start = 221, .end = 220, .cost = 1 }, Edge{ .start = 220, .end = 221, .cost = 1 }, Edge{ .start = 222, .end = 221, .cost = 1 }, Edge{ .start = 221, .end = 222, .cost = 1 }, Edge{ .start = 223, .end = 222, .cost = 2 }, Edge{ .start = 222, .end = 223, .cost = 2 }, Edge{ .start = 224, .end = 223, .cost = 2 }, Edge{ .start = 223, .end = 224, .cost = 2 }, Edge{ .start = 225, .end = 224, .cost = 1 }, Edge{ .start = 224, .end = 225, .cost = 1 }, Edge{ .start = 226, .end = 225, .cost = 1 }, Edge{ .start = 225, .end = 226, .cost = 1 }, Edge{ .start = 227, .end = 226, .cost = 2 }, Edge{ .start = 226, .end = 227, .cost = 2 }, Edge{ .start = 228, .end = 227, .cost = 1 }, Edge{ .start = 227, .end = 228, .cost = 1 }, Edge{ .start = 229, .end = 228, .cost = 1 }, Edge{ .start = 228, .end = 229, .cost = 1 }, Edge{ .start = 230, .end = 229, .cost = 2 }, Edge{ .start = 229, .end = 230, .cost = 2 }, Edge{ .start = 139, .end = 230, .cost = 1 }, Edge{ .start = 230, .end = 139, .cost = 1 }, Edge{ .start = 231, .end = 139, .cost = 1 }, Edge{ .start = 139, .end = 231, .cost = 1 }, Edge{ .start = 232, .end = 231, .cost = 2 }, Edge{ .start = 231, .end = 232, .cost = 2 }, Edge{ .start = 17, .end = 232, .cost = 2 }, Edge{ .start = 232, .end = 17, .cost = 2 }, Edge{ .start = 233, .end = 17, .cost = 1 }, Edge{ .start = 17, .end = 233, .cost = 1 }, Edge{ .start = 234, .end = 233, .cost = 1 }, Edge{ .start = 233, .end = 234, .cost = 1 }, Edge{ .start = 235, .end = 234, .cost = 2 }, Edge{ .start = 234, .end = 235, .cost = 2 }, Edge{ .start = 236, .end = 235, .cost = 1 }, Edge{ .start = 235, .end = 236, .cost = 1 }, Edge{ .start = 237, .end = 236, .cost = 1 }, Edge{ .start = 236, .end = 237, .cost = 1 }, Edge{ .start = 197, .end = 237, .cost = 1 }, Edge{ .start = 237, .end = 197, .cost = 1 }, Edge{ .start = 198, .end = 197, .cost = 2 }, Edge{ .start = 197, .end = 198, .cost = 2 }, Edge{ .start = 199, .end = 198, .cost = 1 }, Edge{ .start = 198, .end = 199, .cost = 1 }, Edge{ .start = 200, .end = 199, .cost = 1 }, Edge{ .start = 199, .end = 200, .cost = 1 }, Edge{ .start = 201, .end = 200, .cost = 2 }, Edge{ .start = 200, .end = 201, .cost = 2 }, Edge{ .start = 238, .end = 201, .cost = 1 }, Edge{ .start = 201, .end = 238, .cost = 1 }, Edge{ .start = 239, .end = 238, .cost = 2 }, Edge{ .start = 238, .end = 239, .cost = 2 }, Edge{ .start = 240, .end = 239, .cost = 1 }, Edge{ .start = 239, .end = 240, .cost = 1 }, Edge{ .start = 241, .end = 240, .cost = 2 }, Edge{ .start = 240, .end = 241, .cost = 2 }, Edge{ .start = 242, .end = 241, .cost = 1 }, Edge{ .start = 241, .end = 242, .cost = 1 }, Edge{ .start = 5, .end = 242, .cost = 1 }, Edge{ .start = 242, .end = 5, .cost = 1 }, Edge{ .start = 243, .end = 5, .cost = 2 }, Edge{ .start = 5, .end = 243, .cost = 2 }, Edge{ .start = 244, .end = 243, .cost = 1 }, Edge{ .start = 243, .end = 244, .cost = 1 }, Edge{ .start = 245, .end = 244, .cost = 1 }, Edge{ .start = 244, .end = 245, .cost = 1 }, Edge{ .start = 246, .end = 245, .cost = 2 }, Edge{ .start = 245, .end = 246, .cost = 2 }, Edge{ .start = 247, .end = 246, .cost = 2 }, Edge{ .start = 246, .end = 247, .cost = 2 }, Edge{ .start = 248, .end = 247, .cost = 3 }, Edge{ .start = 247, .end = 248, .cost = 3 }, Edge{ .start = 250, .end = 249, .cost = 1 }, Edge{ .start = 249, .end = 250, .cost = 1 }, Edge{ .start = 251, .end = 250, .cost = 3 }, Edge{ .start = 226, .end = 251, .cost = 1 }, Edge{ .start = 252, .end = 226, .cost = 1 }, Edge{ .start = 253, .end = 252, .cost = 1 }, Edge{ .start = 254, .end = 253, .cost = 2 }, Edge{ .start = 253, .end = 254, .cost = 2 }, Edge{ .start = 255, .end = 254, .cost = 1 }, Edge{ .start = 254, .end = 255, .cost = 1 }, Edge{ .start = 191, .end = 255, .cost = 1 }, Edge{ .start = 255, .end = 191, .cost = 1 }, Edge{ .start = 256, .end = 191, .cost = 2 }, Edge{ .start = 191, .end = 256, .cost = 2 }, Edge{ .start = 257, .end = 256, .cost = 2 }, Edge{ .start = 256, .end = 257, .cost = 2 }, Edge{ .start = 258, .end = 257, .cost = 1 }, Edge{ .start = 257, .end = 258, .cost = 1 }, Edge{ .start = 259, .end = 258, .cost = 1 }, Edge{ .start = 258, .end = 259, .cost = 1 }, Edge{ .start = 260, .end = 259, .cost = 2 }, Edge{ .start = 259, .end = 260, .cost = 2 }, Edge{ .start = 261, .end = 260, .cost = 1 }, Edge{ .start = 260, .end = 261, .cost = 1 }, Edge{ .start = 262, .end = 261, .cost = 1 }, Edge{ .start = 261, .end = 262, .cost = 1 }, Edge{ .start = 263, .end = 262, .cost = 1 }, Edge{ .start = 262, .end = 263, .cost = 1 }, Edge{ .start = 264, .end = 263, .cost = 1 }, Edge{ .start = 263, .end = 264, .cost = 1 }, Edge{ .start = 265, .end = 264, .cost = 2 }, Edge{ .start = 264, .end = 265, .cost = 2 }, Edge{ .start = 266, .end = 265, .cost = 3 }, Edge{ .start = 265, .end = 266, .cost = 3 }, Edge{ .start = 250, .end = 225, .cost = 2 }, Edge{ .start = 225, .end = 267, .cost = 1 }, Edge{ .start = 267, .end = 268, .cost = 3 }, Edge{ .start = 268, .end = 253, .cost = 1 }, Edge{ .start = 73, .end = 269, .cost = 1 }, Edge{ .start = 269, .end = 73, .cost = 1 }, Edge{ .start = 270, .end = 73, .cost = 1 }, Edge{ .start = 73, .end = 270, .cost = 1 }, Edge{ .start = 185, .end = 270, .cost = 1 }, Edge{ .start = 270, .end = 185, .cost = 1 }, Edge{ .start = 271, .end = 185, .cost = 1 }, Edge{ .start = 185, .end = 271, .cost = 1 }, Edge{ .start = 272, .end = 271, .cost = 1 }, Edge{ .start = 271, .end = 272, .cost = 1 }, Edge{ .start = 32, .end = 272, .cost = 2 }, Edge{ .start = 272, .end = 32, .cost = 2 }, Edge{ .start = 273, .end = 32, .cost = 1 }, Edge{ .start = 32, .end = 273, .cost = 1 }, Edge{ .start = 201, .end = 273, .cost = 1 }, Edge{ .start = 273, .end = 201, .cost = 1 }, Edge{ .start = 274, .end = 201, .cost = 2 }, Edge{ .start = 201, .end = 274, .cost = 2 }, Edge{ .start = 275, .end = 274, .cost = 1 }, Edge{ .start = 274, .end = 275, .cost = 1 }, Edge{ .start = 10, .end = 275, .cost = 2 }, Edge{ .start = 275, .end = 10, .cost = 2 }, Edge{ .start = 11, .end = 10, .cost = 2 }, Edge{ .start = 10, .end = 11, .cost = 2 }, Edge{ .start = 277, .end = 276, .cost = 1 }, Edge{ .start = 276, .end = 277, .cost = 1 }, Edge{ .start = 278, .end = 277, .cost = 1 }, Edge{ .start = 277, .end = 278, .cost = 1 }, Edge{ .start = 279, .end = 278, .cost = 2 }, Edge{ .start = 278, .end = 279, .cost = 2 }, Edge{ .start = 280, .end = 279, .cost = 1 }, Edge{ .start = 279, .end = 280, .cost = 1 }, Edge{ .start = 281, .end = 280, .cost = 2 }, Edge{ .start = 280, .end = 281, .cost = 2 }, Edge{ .start = 132, .end = 281, .cost = 1 }, Edge{ .start = 281, .end = 132, .cost = 1 }, Edge{ .start = 282, .end = 132, .cost = 1 }, Edge{ .start = 132, .end = 282, .cost = 1 }, Edge{ .start = 283, .end = 282, .cost = 1 }, Edge{ .start = 282, .end = 283, .cost = 1 }, Edge{ .start = 284, .end = 283, .cost = 2 }, Edge{ .start = 283, .end = 284, .cost = 2 }, Edge{ .start = 285, .end = 284, .cost = 1 }, Edge{ .start = 284, .end = 285, .cost = 1 }, Edge{ .start = 259, .end = 285, .cost = 1 }, Edge{ .start = 285, .end = 259, .cost = 1 }, Edge{ .start = 286, .end = 259, .cost = 1 }, Edge{ .start = 259, .end = 286, .cost = 1 }, Edge{ .start = 287, .end = 286, .cost = 1 }, Edge{ .start = 286, .end = 287, .cost = 1 }, Edge{ .start = 288, .end = 287, .cost = 1 }, Edge{ .start = 287, .end = 288, .cost = 1 }, Edge{ .start = 15, .end = 288, .cost = 2 }, Edge{ .start = 288, .end = 15, .cost = 2 }, Edge{ .start = 195, .end = 15, .cost = 1 }, Edge{ .start = 15, .end = 195, .cost = 1 }, Edge{ .start = 64, .end = 195, .cost = 2 }, Edge{ .start = 195, .end = 64, .cost = 2 }, Edge{ .start = 289, .end = 64, .cost = 1 }, Edge{ .start = 64, .end = 289, .cost = 1 }, Edge{ .start = 290, .end = 289, .cost = 1 }, Edge{ .start = 289, .end = 290, .cost = 1 }, Edge{ .start = 291, .end = 290, .cost = 2 }, Edge{ .start = 290, .end = 291, .cost = 2 }, Edge{ .start = 39, .end = 291, .cost = 1 }, Edge{ .start = 291, .end = 39, .cost = 1 }, Edge{ .start = 292, .end = 39, .cost = 1 }, Edge{ .start = 39, .end = 292, .cost = 1 }, Edge{ .start = 293, .end = 292, .cost = 1 }, Edge{ .start = 292, .end = 293, .cost = 1 }, Edge{ .start = 294, .end = 293, .cost = 2 }, Edge{ .start = 293, .end = 294, .cost = 2 }, Edge{ .start = 78, .end = 294, .cost = 1 }, Edge{ .start = 294, .end = 78, .cost = 1 }, Edge{ .start = 295, .end = 78, .cost = 2 }, Edge{ .start = 78, .end = 295, .cost = 2 }, Edge{ .start = 296, .end = 295, .cost = 3 }, Edge{ .start = 295, .end = 296, .cost = 3 }, Edge{ .start = 298, .end = 297, .cost = 2 }, Edge{ .start = 297, .end = 298, .cost = 2 }, Edge{ .start = 299, .end = 298, .cost = 2 }, Edge{ .start = 298, .end = 299, .cost = 2 }, Edge{ .start = 300, .end = 299, .cost = 1 }, Edge{ .start = 299, .end = 300, .cost = 1 }, Edge{ .start = 301, .end = 300, .cost = 2 }, Edge{ .start = 300, .end = 301, .cost = 2 }, Edge{ .start = 302, .end = 301, .cost = 1 }, Edge{ .start = 301, .end = 302, .cost = 1 }, Edge{ .start = 303, .end = 302, .cost = 2 }, Edge{ .start = 302, .end = 303, .cost = 2 }, Edge{ .start = 283, .end = 303, .cost = 1 }, Edge{ .start = 303, .end = 283, .cost = 1 }, Edge{ .start = 257, .end = 283, .cost = 2 }, Edge{ .start = 283, .end = 257, .cost = 2 }, Edge{ .start = 304, .end = 257, .cost = 1 }, Edge{ .start = 257, .end = 304, .cost = 1 }, Edge{ .start = 305, .end = 304, .cost = 1 }, Edge{ .start = 304, .end = 305, .cost = 1 }, Edge{ .start = 194, .end = 305, .cost = 1 }, Edge{ .start = 305, .end = 194, .cost = 1 }, Edge{ .start = 306, .end = 194, .cost = 2 }, Edge{ .start = 194, .end = 306, .cost = 2 }, Edge{ .start = 234, .end = 306, .cost = 2 }, Edge{ .start = 306, .end = 234, .cost = 2 }, Edge{ .start = 64, .end = 234, .cost = 2 }, Edge{ .start = 234, .end = 64, .cost = 2 }, Edge{ .start = 307, .end = 64, .cost = 2 }, Edge{ .start = 64, .end = 307, .cost = 2 }, Edge{ .start = 41, .end = 307, .cost = 2 }, Edge{ .start = 307, .end = 41, .cost = 2 }, Edge{ .start = 308, .end = 41, .cost = 1 }, Edge{ .start = 41, .end = 308, .cost = 1 }, Edge{ .start = 309, .end = 308, .cost = 2 }, Edge{ .start = 308, .end = 309, .cost = 2 }, Edge{ .start = 310, .end = 309, .cost = 2 }, Edge{ .start = 309, .end = 310, .cost = 2 }, Edge{ .start = 311, .end = 310, .cost = 1 }, Edge{ .start = 310, .end = 311, .cost = 1 }, Edge{ .start = 312, .end = 311, .cost = 3 }, Edge{ .start = 311, .end = 312, .cost = 3 }, Edge{ .start = 313, .end = 312, .cost = 2 }, Edge{ .start = 312, .end = 313, .cost = 2 }, Edge{ .start = 314, .end = 313, .cost = 3 }, Edge{ .start = 313, .end = 314, .cost = 3 }, Edge{ .start = 315, .end = 308, .cost = 2 }, Edge{ .start = 308, .end = 315, .cost = 2 }, Edge{ .start = 316, .end = 315, .cost = 1 }, Edge{ .start = 315, .end = 316, .cost = 1 }, Edge{ .start = 317, .end = 316, .cost = 2 }, Edge{ .start = 316, .end = 317, .cost = 2 }, Edge{ .start = 318, .end = 317, .cost = 2 }, Edge{ .start = 317, .end = 318, .cost = 2 }, Edge{ .start = 319, .end = 318, .cost = 2 }, Edge{ .start = 318, .end = 319, .cost = 2 }, Edge{ .start = 320, .end = 319, .cost = 2 }, Edge{ .start = 319, .end = 320, .cost = 2 }, Edge{ .start = 321, .end = 320, .cost = 1 }, Edge{ .start = 320, .end = 321, .cost = 1 }, Edge{ .start = 322, .end = 321, .cost = 3 }, Edge{ .start = 321, .end = 322, .cost = 3 }, Edge{ .start = 195, .end = 64, .cost = 1 }, Edge{ .start = 64, .end = 195, .cost = 1 }, Edge{ .start = 323, .end = 195, .cost = 2 }, Edge{ .start = 195, .end = 323, .cost = 2 }, Edge{ .start = 11, .end = 323, .cost = 2 }, Edge{ .start = 323, .end = 11, .cost = 2 }, Edge{ .start = 7, .end = 11, .cost = 3 }, Edge{ .start = 11, .end = 7, .cost = 3 }, Edge{ .start = 123, .end = 7, .cost = 2 }, Edge{ .start = 7, .end = 123, .cost = 2 }, Edge{ .start = 324, .end = 123, .cost = 1 }, Edge{ .start = 123, .end = 324, .cost = 1 }, Edge{ .start = 325, .end = 324, .cost = 2 }, Edge{ .start = 324, .end = 325, .cost = 2 }, Edge{ .start = 326, .end = 325, .cost = 2 }, Edge{ .start = 325, .end = 326, .cost = 2 } } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const std = @import("std"); | |
| const ArrayList = std.ArrayList; | |
| pub fn readLines(filename: []const u8) ![]const LineTime { | |
| const test_allocator = std.testing.allocator; | |
| var lines = ArrayList(LineTime).init(test_allocator); | |
| var file = try std.fs.cwd().openFile(filename, .{}); | |
| var buf: [1000]u8 = undefined; | |
| defer file.close(); | |
| var buf_reader = std.io.bufferedReader(file.reader()); | |
| var in_stream = buf_reader.reader(); | |
| while (try in_stream.readUntilDelimiterOrEof(buf[0..], '\n')) |line| { | |
| try lines.append(try LineTime.parse(line)); | |
| } | |
| return lines.items; | |
| } | |
| const LineTime = struct { | |
| name: []const u8, | |
| startStation: []const u8, | |
| endStation: []const u8, | |
| duration: i32, | |
| oneWay: i32 = 0, | |
| pub fn parse(line: []const u8) !LineTime { | |
| const test_allocator = std.testing.allocator; | |
| var name = ArrayList(u8).init(test_allocator); | |
| var startStation = ArrayList(u8).init(test_allocator); | |
| var endStation = ArrayList(u8).init(test_allocator); | |
| var duration: i32 = 0; | |
| var oneWay: i32 = 0; | |
| var it = std.mem.tokenize(u8, line, "\t"); | |
| if (it.next()) |item| { | |
| try name.appendSlice(item); | |
| } | |
| if (it.next()) |item| { | |
| try startStation.appendSlice(item); | |
| } | |
| if (it.next()) |item| { | |
| try endStation.appendSlice(item); | |
| } | |
| if (it.next()) |item| { | |
| var timeSplit = std.mem.split(u8, item, ":"); | |
| _ = timeSplit.next(); | |
| if (timeSplit.next()) |time| { | |
| duration = std.fmt.parseInt(i32, time, 10) catch 0; | |
| } | |
| } | |
| if (it.next()) |item| { | |
| oneWay = std.fmt.parseInt(i32, item, 10) catch 0; | |
| } | |
| return LineTime { | |
| .name = name.items, | |
| .startStation = startStation.items, | |
| .endStation = endStation.items, | |
| .duration = duration, | |
| .oneWay = oneWay, | |
| }; | |
| } | |
| pub fn format( | |
| self: LineTime, | |
| comptime fmt: []const u8, | |
| options: std.fmt.FormatOptions, | |
| writer: anytype, | |
| ) !void { | |
| _ = fmt; | |
| _ = options; | |
| try writer.print("({s}-{s}->{s},{},{})", .{ | |
| self.name, | |
| self.startStation, | |
| self.endStation, | |
| self.duration, | |
| self.oneWay, | |
| }); | |
| } | |
| }; | |
| const Structure = struct { | |
| nodes: ArrayList(Node), | |
| edges: ArrayList(Edge), | |
| const Self = @This(); | |
| pub fn build(lines: []const LineTime) !Structure { | |
| const test_allocator = std.testing.allocator; | |
| var nodeMap = std.StringHashMap(Node).init(test_allocator); | |
| var i: i32 = 0; | |
| for (lines) |line| { | |
| var v = try nodeMap.getOrPut(line.startStation); | |
| if (!v.found_existing) { | |
| v.value_ptr.* = Node { | |
| .name = line.startStation, | |
| .id = i, | |
| }; | |
| i += 1; | |
| } | |
| } | |
| var edges = ArrayList(Edge).init(test_allocator); | |
| for (lines) |line| { | |
| if (nodeMap.get(line.startStation)) |startNode| { | |
| if (nodeMap.get(line.endStation)) |endNode| { | |
| if (line.oneWay == 0 or line.oneWay == 1) { | |
| try edges.append( | |
| Edge { | |
| .start = startNode.id, | |
| .end = endNode.id, | |
| .cost = line.duration, | |
| } | |
| ); | |
| } | |
| } | |
| if (nodeMap.get(line.endStation)) |endNode| { | |
| if (line.oneWay == 0 or line.oneWay == -1) { | |
| try edges.append( | |
| Edge { | |
| .start = endNode.id, | |
| .end = startNode.id, | |
| .cost = line.duration, | |
| } | |
| ); | |
| } | |
| } | |
| } | |
| } | |
| var nodes = ArrayList(Node).init(test_allocator); | |
| var allNodes = nodeMap.iterator(); | |
| while(allNodes.next()) |entry| { | |
| try nodes.append(entry.value_ptr.*); | |
| } | |
| return Self { | |
| .nodes = nodes, | |
| .edges = edges, | |
| }; | |
| } | |
| }; | |
| const Node = struct { | |
| name: []const u8, | |
| id: i32, | |
| pub fn format( | |
| self: Node, | |
| comptime fmt: []const u8, | |
| options: std.fmt.FormatOptions, | |
| writer: anytype, | |
| ) !void { | |
| _ = fmt; | |
| _ = options; | |
| try writer.print("({}-{s})", .{ | |
| self.id, self.name, | |
| }); | |
| } | |
| }; | |
| const Edge = struct { | |
| start: i32, | |
| end: i32, | |
| cost: i32, | |
| }; | |
| pub fn main() !void { | |
| // parse doc into line, source, destination, directionality (bi) | |
| var lines = try readLines("./lines.tsv"); | |
| std.debug.print("{s}\n", .{lines}); | |
| // build index of locations along the way | |
| var structures = try Structure.build(lines); | |
| // write out nodes and edges based on index | |
| std.debug.print("{s}\n", .{structures.nodes.items}); | |
| std.debug.print("{s}\n", .{structures.edges.items}); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment