#include #include using namespace std; #define buflen 256 struct Edge { Edge(int t, double c) : target(t), chance(c) {} int target; double chance; bool operator<(const Edge &e) const { return chance>e.chance; } }; struct Vertex { Vertex() : visited(false) { } ~Vertex() { edges.clear(); } set edges; bool visited; }; int n, m; Vertex *v; double best; void addEdge(int a, int b, int chance) { double c = chance/100.; --a; --b; v[a].edges.insert(Edge(b,c)); v[b].edges.insert(Edge(a,c)); } void examine(int i, double p) { Vertex &vi = v[i]; if (vi.visited) return; if (i==n-1) { if (p>best) best = p; } vi.visited = true; for (set::iterator it=vi.edges.begin(); it!=vi.edges.end(); ++it) { double q = p*it->chance; if (q > best) examine(it->target, q); } vi.visited = false; } int main() { char buf[buflen]; FILE *f=fopen("chicago.in", "rb"); while (fgets(buf, buflen, f)) { if (2!=sscanf(buf, "%i %i", &n, &m)) return -1; v = new Vertex[n]; for (int i=0; i