#include #define REP(i,n) for(int i=0,i##_len=(n);i>; void visit(const Graph &g, int v, vector< vector >& scc, stack &S, vector &inS, vector &low, vector &num, int& time) { low[v] = num[v] = ++time; S.push(v); inS[v] = true; for(auto e: g[v]) { int w = e; if (num[w] == 0) { visit(g, w, scc, S, inS, low, num, time); low[v] = min(low[v], low[w]); } else if (inS[w]) low[v] = min(low[v], num[w]); } if (low[v] == num[v]) { scc.push_back(vector()); while (1) { int w = S.top(); S.pop(); inS[w] = false; scc.back().push_back(w); if (v == w) break; } } } void stronglyConnectedComponents(const Graph& g, vector< vector >& scc) { const int n = g.size(); vector num(n), low(n); stack S; vector inS(n); int time = 0; REP(u, n) if (num[u] == 0) visit(g, u, scc, S, inS, low, num, time); } int main(){ int N;cin>>N; vector> X(N,vector(N)),graph(N); REP(i,N) REP(j,N){ cin>>X[i][j]; if(X[i][j]) graph[i].push_back(j); } vector A(N); REP(i, N){ cin >> A[i]; } int ans=INT_MAX; vector> scc; stronglyConnectedComponents(graph,scc); vector> B(N,vector(N,false)); REP(bit,1<>j&1){ res+=A[j]; } bool flag=true; REP(i,N) if(~bit>>i&1){ rep(j,i+1,N) if((~bit>>j&1)&&X[i][j]){ if(X[j][i]) flag=false; } } REP(i,scc.size()){ bool ok=false; for(auto e:scc[i]){ if(bit>>e&1) ok=true; } if(!ok) flag=false; } if(flag) ans=min(ans,res); } cout<