#include #include #include #include #include #include #include #include #include #include using namespace std; /* bool dfs(vector> &G, vector &visit, int pos){ visit[pos] = true; if(pos == G.size()-1) return true; for(int to : G[pos]){ if(visit[to]) continue; if(dfs(G,visit,to)) return true; } return false; } #include int main(){ int n,m; cin >> n >> m; assert(m<16); vector a(m),b(m),c(m); for(int i=0; i> a[i] >> b[i] >> c[i]; } double ans = 0.0; for(int i=0; i<(1<> G(n); vector visit(n,false); for(int j=0; j>j)&1){ tmp *= c[j]/100.0; G[a[j]].push_back(b[j]); }else{ tmp *= 1.0 - c[j]/100.0; } } if(dfs(G,visit, 0)){ ans += tmp; } } printf("%.12f\n", ans); return 0; } */ void TopologicalSort_dfs(vector > &G, vector &res, int node, vector &visit){ if(visit[node] == true) return; visit[node] = true; for(auto itr = G[node].rbegin(); itr != G[node].rend(); itr++){ TopologicalSort_dfs(G, res, *itr, visit); } /* for(int i=0; i TopologicalSort(vector> &G){ int n = G.size(); vector ret; vector visit(n,false); for(int i=0; i> n >> m; vector a(m),b(m),c(m); for(int i=0; i> a[i] >> b[i] >> c[i]; } vector> G(n); for(int i=0; i topo_inv(n); for(int i=0; i>> rev(n); for(int i=0; i p(n, 0); p[0] = 1.0; for(int z=1; z>j)&1){ x *= p[rev[pos][j].first]; y *= (100-rev[pos][j].second)/100.0; }else{ x *= (1-p[rev[pos][j].first]); } } y = 1.0 - y; p[pos] += x*y; } } printf("%.12f\n", p[n-1]); return 0; }