Skip to content

Instantly share code, notes, and snippets.

@ewalk153
Last active March 3, 2022 03:33
Show Gist options
  • Select an option

  • Save ewalk153/5d7a609d61477e8ebbee267b7474e968 to your computer and use it in GitHub Desktop.

Select an option

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.
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
❯ 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 } }
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