#include #include #include #include #include #include #include #include #include #include using namespace std; bool dfs(vector> &G, vector &visit, int pos, int goal){ visit[pos] = true; if(pos == goal) return true; for(int to : G[pos]){ if(visit[to]) continue; if(dfs(G,visit,to,goal)) return true; } return false; } #include void solver(int n, int m, vector a, vector b, vector c){ for(int ___=0; ___> 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 ", ans); } printf("\n"); } 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 > &G is edge list. G[i][j] := edge goes to node[G[i][j]] from node[i] //vector > from . from[i] := nodes set which have edge going to node[i] //set begin := the nodes those indegree is zero vector TopologicalSorting_lex_smallest(vector > &G, vector< set > &from, set &begin){ vector ret; while( begin.size() > 0 ){ int val = *(begin.begin()); // using "begin.rbegin()", lexicographically largest one begin.erase( val ); ret.push_back(val); for(auto itr = G[val].begin() ; itr != G[val].end(); itr++){ int m = *itr; if( from[m].size() == 1 ){ begin.insert(m); } from[m].erase(val); } } return ret; } vector TopologicalSorting_lex_smallest_call(vector> &G){ int n = G.size(); vector> rev(n); set begin; for(int i=0; i ostream& operator << (ostream& os, vector vec){ for(int i=0; i int main(){ int n,m; cin >> n >> m; vector a(m),b(m),c(m); for(int i=0; i> a[i] >> b[i] >> c[i]; } //solver(n,m,a,b,c); vector> G(n); for(int i=0; i topo_inv(n); for(int i=0; i>> rev(n); for(int i=0; i> dp(n, vector(1<>k)&1){ y *= 1.0 - z.second; } } y = 1.0-y; dp[i][s|(1< p(n, 0); for(int i=0; i<(1<>j)&1){ p[topo[j]] += dp[n-1][i]; } } } /* vector p(n, 0); p[0] = 1.0; for(int z=1; z(i) << endl; double x = 1.0; double y = 1.0; for(int j=0; j>j)&1){ x *= p[rev[pos][j].first]; y *= (1-rev[pos][j].second); }else{ x *= (1-p[rev[pos][j].first]); } } y = 1.0 - y; p[pos] += x*y; } } */ /* for(int i=0; i