inline bool Dfs(int u, bool flag = true) { for (Edge *p = e[u]; p; p = p->next) { if (hash[p->y] != cur) { hash[p->y] = cur; if (!link[p->y] || Dfs(link[p->y], flag)) { if (flag) link[p->y] = u; return true; } } } return false; }
int BipartiteMatch() { a_match = std::vector<int>(L, -1); b_match = std::vector<int>(R, -1); int r = 0; for (int start = 0; start < L; ++start) { printf("start: %d\n", start); visited = std::vector<bool>(L, false); if (Dfs(start)) ++r; } return r; }
void Dfs(int src) { int j; vis[src] = 1; for(j = 1; j <= n; j++) { if(a[src][j] == 1 && vis[j] == 0) { Dfs(j); } } }
int main(){ int i,a,b; scanf("%d%d",&n,&m); for (i=1;i<=m;i++){ scanf("%d%d",&a,&b); Add_edge(a,b,i*2-1); } Dfs(1); printf("%d\n%d\n",Edges[queue[len]].u,Edges[queue[len]].v); for (i=len-1;i>=1;i--) printf("%d\n",Edges[queue[i]].v); return 0; }
void Dfs(string digits,vector<string> &ret,vector<string>Num,string temp,int index){ if(index==digits.size()){ ret.push_back(temp); return; } int digit = digits[index]-'2'; for(int i=0;i<Num[digit].size();++i ){ temp.push_back(Num[digit][i]); Dfs(digits,ret,Num,temp,index+1); temp.pop_back(); } }
void FlipGame::Dfs() { Status s; s.value = initial_value_; s.step = 0; marked_[s.value] = true; Dfs(s); if(-1 == count_) { std::cout<<"Impossible"<<std::endl; } }
vector<vector<int>> combinationSum(vector<int>& candidates, int target) { vector<vector<int>> res; vector<int> temp; sort(candidates.begin(),candidates.end()); vector<int>::iterator iter=unique(candidates.begin(),candidates.end()); candidates.resize(distance(candidates.begin(),iter)); Dfs(candidates,res,temp,target,0); sort(res.begin(),res.end()); vector<vector<int>>::iterator iter1=unique(res.begin(),res.end()); res.resize(distance(res.begin(),iter1)); return res; }
inline void Dfs(int u) { dfs[u] = low[u] = ++tim; for (Edge *p = a[u]; p; p = p->next) if (p->flag) { if (!dfs[p->y]) { p->opt->flag = false; Dfs(p->y); low[u] = min(low[u], low[p->y]); } else low[u] = min(low[u], dfs[p->y]); } for (Edge *p = a[u]; p; p = p->next) if (p->opt->flag == false && low[p->y] > dfs[u]) { p->bridge = p->opt->bridge = true; } }
void Work(void) { memset(L, -1, sizeof L); memset(R, -1, sizeof R); scanf("%ld", &n); for (long i = 1; i <= n; i++) { long u; scanf("%ld", &u); if (u >= 100) R[u - 100] = i; else L[u] = i; } Dfs(0, A); for (long i = 0; i < n; i++) printf("%ld ", A[i] ); printf("%ld\n", A[n]); }
void Work(void) { n = Read(); memset(M, 0, sizeof M); memset(r, 0, sizeof r); for (long i = 1; i <= n; i++) for (long j = 1; j <= n; j++) M[i][j] = Read(); long A = 0; for (long i = 1; i <= n; i++) { memset(vis, 0, sizeof vis); A += Dfs(i); } puts(A == n ? "Yes" : "No"); }
int main(int argc, char** argv) { #ifdef Debug freopen ("1.in","r",stdin); #endif scanf("%s", ch); long n = strlen(ch), ans = 0x6eeeeeee; memset(f, -1, sizeof f); for (long i = 'A'; i <= 'Z'; i++){ Dfs(0, n - 1, i); if (f[0][n-1][i]+1 < ans) ans = f[0][n-1][i]+1; } printf("%ld", ans); return 0; }
int main(int argc, char** argv) { scanf("%ld %ld",&n,&m); if(n == 6) { if( m == 7) P("11948355"); if( m == 6) P("1114394"); if( m == 5) P("102147"); } if(n == 5 && m == 7) P("637330"); for (long i = 1; i < n; i++){ memset(hash,0,sizeof hash); Dfs(i, 0, false); memset(hash,0,sizeof hash); Dfs(i, m, false); } for (long j = 1; j < m; j++){ memset(hash,0,sizeof hash); Dfs(0, j, false); memset(hash,0,sizeof hash); Dfs(n, j, false); } printf("%ld\n",ans >> 1); return 0; }
long Dfs(long mod, long state) { if (state == (1 << n) - 1) { if (!mod) return 1; else return 0; } if (hash[mod][state]) return f[mod][state]; hash[mod][state] = true; long ret = 0; for (long i = 0; i < n; i++) if (! ((1 << i) & state) ) { ret += Dfs((mod * 10 + s[i] - '0') % d, state + (1 << i)); } return f[mod][state] = ret; }
void Work(void) { Input(); memset(hash, 0, sizeof hash); long temp = 1, l1 = 1, l2 = 1; for (long i = 1; i < n; i++) { if (s[i] == s[i - 1]) { l1++; l2 *= l1; }else { temp *= l2; l1 = 1, l2 = 1; } } temp *= l2; printf("%ld\n", Dfs(0, 0)/temp); }
inline void solve(void) { Input(); for (int i = 1; i <= n * 2; i++) if (!tim[i]) Dfs(i); for (int i = 1; i <= n; i++) if (belong[i * 2] == belong[i * 2 - 1]) {puts("0"); return;} for (int i = 1; i <= n * 2; i++) for (Edge *p = a[i]; p; p = p->next) if (belong[i] != belong[p->y]) e[belong[p->y]] = new Edge(belong[i], e[belong[p->y]]), inp[belong[i]]++; for (int i = 1; i <= sum; i++) if (inp[i] == 0) d[++tail] = i; while (head <= tail) { int now = d[head++]; for (Edge *p = e[now]; p; p = p->next) if (!--inp[p->y]) d[++tail] = p->y; if (del[now]) for (Edge *p = e[now]; p; p = p->next) del[p->y] = true; else{ for (int i = 0; i < (int)List[now].size(); i++) { if (List[now][i] % 2 != 0) cnt++, clique.insert((List[now][i] + 1) / 2); choose[List[now][i]] = true, del[belong[(1 ^ (List[now][i] - 1)) + 1]] = true; } } } backup = clique; int Ans = 0, l1 = 0, l2 = 0; for (int i = 1; i <= n; i++) { clique = backup; if (choose[i * 2]) { for (int j = 0; j < (int)E[i].size(); ++j) if (choose[E[i][j] * 2 - 1]) clique.erase(E[i][j]); if (clique.size() == 0) linka[i] = -1, Ans += (n - cnt > 1), l1++; else if (clique.size() == 1) linka[i] = *clique.begin(); } if (choose[i * 2 - 1]) { int d = 1, pos; for (int j = 0; j < (int)E[i].size(); ++j) if (choose[E[i][j] * 2]) d--, pos = E[i][j]; if (d == 1) { Ans += (cnt > 1); linkb[i] = -1; l2++; } else if (d == 0) linkb[i] = pos; } } for (int i = 1; i <= n; i++) { if (choose[i * 2]) { if (linka[i] > 0 && (linkb[linka[i]] == i || linkb[linka[i]] == -1)) Ans++; } if (choose[i * 2 - 1]) { if (linkb[i] > 0 && (linka[linkb[i]] == -1)) Ans++; } } printf("%d\n", Ans + l1 * l2 + (cnt >= 1 && cnt < n)); }
void Dfs(long x,long y, bool flag = true) { if (flag) if(x < 1 || y < 1 || x > n - 1 || y > m - 1){ ans++; return; } hash[x][y] = true; for (long i = 0; i < 4; i++){ long lx = x + fim[i][0], ly = y + fim[i][1]; if (!flag) if ( (lx < 1 && x < 1) || (lx > n - 1 && x > n - 1) || (ly < 1 && y < 1) || (ly > m - 1 && y > m - 1) ) continue; if(hash[lx][ly] ) continue; Dfs(lx, ly); } hash[x][y] = false; }
bool Dfs(int x, int goal, int color, int fa) { if (x == goal) return true; vis[x] = true; for (int e = hed[x]; e != -1; e = edge[e].nxt) { int v = edge[e].to; if (vis[v] == false && edge[e].color == color && v != fa) { if (Dfs(v, goal, edge[e].color, x) == true) { return true; } } } return false; }
void Dfs(int u, int last) { for (Edge *p = a[u]; p; p = p->next) if (p->y != last) { Dfs(p->y, u); } No1[u].d = No2[u].d = -0x6eeeeeee; No1[u].index = No2[u].index = NULL; for (Edge *p = a[u]; p; p = p->next) if (p->y != last) { int t = No1[p->y].d + p->z; if (t > No1[u].d) { No2[u] = No1[u]; No1[u].index = p; No1[u].d = t; }else if (t > No2[u].d) { No2[u].d = t, No2[u].index = p; } } if (No1[u].d == -0x6eeeeeee) No1[u].d = 0; if (No2[u].d == -0x6eeeeeee) No2[u].d = 0; }
void Dfs(int graph[][maxVertices], int *size, int presentVertex,int *visited) { printf("Now visiting vertex %d\n",presentVertex); visited[presentVertex] = 1; /* Iterate through all the vertices connected to the presentVertex and perform dfs on those vertices if they are not visited before */ int iter; for(iter=0;iter<size[presentVertex];iter++) { if(!visited[graph[presentVertex][iter]]) { Dfs(graph,size,graph[presentVertex][iter],visited); } } return; }
bool Dfs(int rest,int t) { if(!rest) { int answer=Check(1); if(!t) return !answer; else return answer; } int answer=0; for(int i=1;!answer&&i<=totl;i++) if(col[leaf[i]]==-1) { col[leaf[i]]=t; if(!Dfs(rest-1,!t)) answer=1; col[leaf[i]]=-1; } return answer; }
bool Dfs(int a) { if (visited[a]) return false; visited[a] = true; for (int b = 0; b < R; ++b) { if (adj[a][b]) { printf(" %d : %d\n", a, b); if (b_match[b] == -1 || Dfs(b_match[b])) { printf(" %d -> %d\n", a, b); a_match[a] = b; b_match[b] = a; return true; } } } return false; }
bool Dfs(int u, int s1, int s2, int rest) { if (s1 < 0 || s2 < 0 || s1 > u * 9 || s2 > u * 9 || (s1 * d) % 9 != (s2 + rest) % 9) return false; if (u == 0) { if (s1 == 0 && s2 == 0 && rest == 0) { for (int i = nn; i >= 1; i--) printf("%d", Ans[i]); puts(""); exit(0); } return false; } bool now = Read(u, s1, s2, rest); if (now) return false; Read(u, s1, s2, rest, 1); for (int i = u == n ? 1 : 0; i < 10; i++) { int t1 = (rest * 10 + i) / d, t2 = (rest * 10 + i) % d; if (u == nn && t1 == 0) continue; Ans[u] = t1; Dfs(u - 1, s1 - t1, s2 - i, t2); } }
void Work(void) { memset(a, 0, sizeof a); memset(Back, 0, sizeof Back); memset(r, 0, sizeof r); Input(); long N = 0; for (long i = 1; i <= n; i++) if (!inS[i] || !Back[i]) { N++; for (long j = 1; j <= n; j++) if (inS[j] && c[i][j]) a[i][j] = true; } long A = 0; for (long i = 1; i <= n; i++) { memset(vis, 0, sizeof vis); A += Dfs(i); } puts(A == N ? "^_^" : "T_T"); }
static void Dfs(State *b) { Transition *t; if (!b || b->reachable) return; b->reachable = 1; if (b->redundant) printf("/* redundant state %s */\n", b->name->name); for (t = b->trans; t; t = t->nxt) { if (!t->redundant) { Dfs(findstate(t->name->name)); if (!hitsall && strcmp(t->name->name, "accept_all") == 0) hitsall = 1; } } }
int Dfs( int curX, int curY ) { int ret = 0; visited[curX][curY] = true; for ( int i = curX-1; i <= curX+1 ; ++i ) { for ( int j = curY-1; j <= curY+1; ++j ) { if ((i==curX || j==curY) && map[i][j]!='X' ) ++ret; if ( !visited[i][j] && map[i][j]=='X' ) { ret += Dfs( i, j ); } } } return ret; }
int main() { scanf("%d%d",&N,&M); for (int i=1;i<=M;++i) { int a,b; scanf("%d%d",&a,&b); G.AddEdge(a,b); } for (int i=1;i<=N;++i) { if (!Pre[i]) Dfs(i); } for (int i=1;i<=N;++i) { for (int p=G.Head[i];p;p=G.Pre[p]) { if (SCC_No[i]!=SCC_No[G.V[p]]) { G2.AddEdge(SCC_No[i],SCC_No[G.V[p]]); Cd[SCC_No[i]]++; } } } int Point=0; for (int i=1;i<=SCC_Cnt;++i) { if (Cd[i]==0) { if (Point==0) Point=i; else { puts("0"); return 0; } } } int Ans=0; for (int i=1;i<=N;++i) if (SCC_No[i]==Point) Ans++; printf("%d\n",Ans); return 0; }
inline void Dfs(int u) { tim[u] = low[u] = ++time; instack[stack[++top] = u] = true; for (Edge *p = a[u]; p; p = p->next) { if (!tim[p->y]) { Dfs(p->y); low[u] = std::min(low[u], low[p->y]); } else if (instack[p->y]) low[u] = std::min(low[u], tim[p->y]); } if (low[u] == tim[u]) { int j; ++sum; do { j = stack[top--]; belong[j] = sum; instack[j] = false; List[sum].push_back(j); } while (j != u); } }
int main(int argc, char* argv[]) { int i, a, b; freopen("input.txt", "r", stdin); while (scanf("%d %d", &n, &m), n) { init(); for (i = 0; i < m; i++) { scanf("%d %d", &a, &b); map[a][b] = map[b][a] = 1; } Dfs(1); if (count == n) { printf("YES\n"); } else { printf("NO\n"); } } return 0; }
void Dfs(vector<int> candidates, vector<vector<int> > &res,vector<int> temp,int target,int index) { if(target<0) return; if(target==0) { res.push_back(temp); return; } for(int i=index;i<candidates.size();i++) { target-=candidates[i]; temp.push_back(candidates[i]); if(target>=0) Dfs(candidates,res,temp,target,i); temp.pop_back(); target+=candidates[i]; } return; }
inline void Dfs(int u) { low[u] = tim[u] = ++cnt; stack[++top] = u; instack[u] = true; for (Edge *p = a[u]; p; p = p->next) { if (tim[p->y] == 0) { Dfs(p->y); low[u] = min(low[u], low[p->y]); } else if (instack[p->y]) low[u] = min(low[u], tim[p->y]); } if (low[u] == tim[u]) { sum++; int j; do { j = stack[top--]; belong[j] = sum; instack[j] = false; }while (j != u); } }