예제 #1
0
파일: 2437.cpp 프로젝트: AiHaibara/acm-icpc
	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;
	}
예제 #2
0
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;
}
예제 #3
0
파일: 07bDfs.c 프로젝트: Diksha94/VTU
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);
		}
	}
}
예제 #4
0
파일: 2230.cpp 프로젝트: chronotable/procon
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();
     }
 }
예제 #6
0
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;
    }
}
예제 #7
0
	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;
	}
예제 #8
0
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;
	}
}
예제 #9
0
파일: 1078.cpp 프로젝트: AiHaibara/acm-icpc
 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]);
 }
예제 #10
0
파일: 1059.cpp 프로젝트: AiHaibara/acm-icpc
	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");
	}
예제 #11
0
파일: 1260.cpp 프로젝트: AiHaibara/acm-icpc
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;
}
예제 #12
0
파일: 1259.cpp 프로젝트: AiHaibara/acm-icpc
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;
}
예제 #13
0
파일: 1072.cpp 프로젝트: AiHaibara/acm-icpc
 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;
 }
예제 #14
0
파일: 1072.cpp 프로젝트: AiHaibara/acm-icpc
 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);
 }
예제 #15
0
파일: kon.cpp 프로젝트: AiHaibara/acm-icpc
	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));
	}
예제 #16
0
파일: 1259.cpp 프로젝트: AiHaibara/acm-icpc
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;
}
예제 #18
0
파일: 1912.cpp 프로젝트: AiHaibara/acm-icpc
	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;
	}
예제 #19
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;


}
예제 #20
0
파일: ah.cpp 프로젝트: cjsoft/inasdfz
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;
}
예제 #21
0
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;
}
예제 #22
0
파일: 2147.cpp 프로젝트: AiHaibara/acm-icpc
	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);
		}
	}
예제 #23
0
파일: 1433.cpp 프로젝트: qscqesze/acm-icpc
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");
}
예제 #24
0
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;
		}
	}
}
예제 #25
0
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;

}
예제 #26
0
파일: main.cpp 프로젝트: linmx0130/OJCode
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;
}
예제 #27
0
파일: kon.cpp 프로젝트: AiHaibara/acm-icpc
	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);
		}
	}
예제 #28
0
파일: main.c 프로젝트: hustlijian/oj-jobdu
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;
}
예제 #29
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;
	}
예제 #30
0
파일: 2753.cpp 프로젝트: AiHaibara/acm-icpc
	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);
		}
	}