Bonjour, je souhaite m'inscrire à un concours d'algo (le Google Code Jam) donc je m'entraine sur UVA Online Judge. Je tente donc le premier exercice du module Contest Problems. Je vous laisse lire le sujet, je met en spoiler mon code ainsi que mon entrée.
Mon code (edit : code commenté):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | #include <iostream> #include <list> #include <utility> #include <map> #include <string> #include <vector> #include <sstream> using namespace std; int main(void){ int caseNumber = 1; unsigned int nbNodes; cin >> nbNodes; ostringstream out; while(nbNodes > 0){ int start; cin >> start; int first, second; // From node to another map<int, vector<int>> adjancy; // Build the links do{ cin >> first >> second; adjancy[first].push_back(second); }while(first != 0 && second != 0); // Length then node list<pair<int, int>> current; // initialise with the start current.push_front(make_pair(0, start)); pair<int, int> max = *current.begin(); while(!current.empty()){ for(list<pair<int, int>>::iterator it = current.begin(); it != current.end(); /* */){ int count = adjancy.count(it->second); // if there's no link from this node we delete it (or save if longer) if(count == 0){ if(it->first > max.first) max = *it; else if(it->first == max.first) max = (it->second > max.second) ? max:*it; it = current.erase(it); } else{ int size = adjancy[it->second].size(); // we add a new pair for each links starting from the node minus 1 for(int i = 1; i < size; ++i){ current.push_back(make_pair(it->first + 1, adjancy[it->second][i])); } it->first++; it->second = adjancy[it->second].front(); ++it; } } } cout << "Case " << caseNumber << ": The longest path from " << start << " has length " << max.first << " , finishing at " << max.second << "\n"; ++caseNumber; cin >> nbNodes; } //cout << out.str(); return 0; } |
Mon entrée (avec 25 noeuds et 32 liaisons) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 25 1 1 15 1 14 2 16 3 18 3 17 3 4 5 15 6 5 6 20 7 5 8 12 9 8 10 21 11 10 12 22 12 23 13 9 14 6 15 2 16 3 16 4 17 19 18 19 19 9 19 13 19 24 20 7 22 11 23 11 23 25 24 13 25 22 0 0 0 |
Si vous le faites tourner, vous aller voir que c'est assez lent, mais je n'arrive pas à savoir d'où ça vient… Du coup j'en appelle à votre générosité :p.
+0
-0