예제 #1
0
파일: poj2446.cpp 프로젝트: tommy5198/acm
void dfs1(int x, int y, int p, bool LR){
    for(int i=0; i<4; i++){
        int tx = x+d[i][0], ty = y+d[i][1];
        if(LR){
            if(!mat[tx][ty]){
                mat[tx][ty] = l++;
                dfs1(tx, ty, l-1, !LR);
            }
        }else{
            if(mat[tx][ty] >= 0){
                int tmp = mat[tx][ty];
                if(!tmp)
                    mat[tx][ty] = tmp = r++;
                e[p][tmp] = true;
                if(!L[p] && !R[tmp])
                    L[p] = tmp, R[tmp] = p;
                dfs1(tx, ty, l, !LR);
            }
        }
    }
}
예제 #2
0
파일: 2599.cpp 프로젝트: Eopxt/OI
void dfs1(int x, int pre) {
    if (d[x] > m)
        return;
    if (v[m - d[x]] == now)
        checkmin(ans, c[m - d[x]] + e[x]);
    for (int k = h[x]; ~k; k = nxt[k])
        if (mk[k] && p[k] != pre) {
            d[p[k]] = d[x] + w[k];
            e[p[k]] = e[x] + 1;
            dfs1(p[k], x);
        }
}
void dfs1(int src,int par){
    eid[ein[src]=++ecnt]=src;
    sz[src]=1;
    hvy[src]=-1;
    for(int i:adj[src]){
        if(i==par)continue;
        dfs1(i,src);
        sz[src]+=sz[i];
        if(!~hvy[src]||sz[hvy[src]]<sz[i]) hvy[src]=i;
    }
    eout[src]=ecnt;
}
 vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) {
     vector<vector<int>> graph(N, vector<int>());
     for (auto edge : edges) {
         graph[edge[0]].push_back(edge[1]);
         graph[edge[1]].push_back(edge[0]);
     }
     
     vector<int> sums(N), counts(N, 1);
     dfs1(0, -1, graph, sums, counts);
     dfs2(0, -1, graph, sums, counts);
     return sums;
 }
void dfs1(int x)
{
	if(flag[x]) return ;
	else
	{
		flag[x]=1;
		int i;
		for(i=1;i<=n;i++)
		{
			if(b[x][i]&&flag[i]==0) dfs1(i);
		}
	}
}
예제 #6
0
파일: main.cpp 프로젝트: EyciaZhou/acm-fake
	void init(int n) {
		for (int i = 0; i < N; i++) {
			g2[i].clear();
			g3[i].clear();
		}
		mem = 0;
		
		gentree(n);
		dfs1(getf(1), 0);
		dfs2(getf(1), getf(1));
		
		segtree::init(mem);
	}
void kosarajuSCC() {
    memset(visited, false, sizeof visited);
    for(int i = 0; i < N; ++i) if(!visited[i]) dfs1(i);
    transposeGraph();
    memset(visited, false, sizeof visited);
    while(!Stack.empty()) {
        int v = Stack.top();
        Stack.pop();
        if(!visited[v]) {
            dfs2(v);
            // printf("\n");
        }
    }
}
예제 #8
0
파일: 1236.cpp 프로젝트: hzhua/ojprogram
void korasaju()
	{
	for(int i=1;i<=n;i++)
		if(!apr[i])
			{dfs1(i);}
	memset(apr,0,sizeof(apr));
	for(int i=sn;i>=1;i--)
		if(!apr[stack[i]])
			dfs2(stack[i],++connC);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(gMap[i][j] && mapNo[i]!=mapNo[j])
				nMap[mapNo[i]][mapNo[j]]=true;
	}
예제 #9
0
void dfs1(int u, int f, int d) {
    fa[u] = f;
    son[u] = -1;
    deep[u] = d;
    t_size[u] = 1;
    for (int i = 0; i < (int)G[u].size(); i++) {
        int v = G[u][i];
        if (v == f) continue;
        dfs1(v, u, d + 1);
        t_size[u] += t_size[v];
        if (son[u] == -1 || t_size[v] > t_size[son[u]])
            son[u] = v;
    }
}
예제 #10
0
int solve() {
	int i, nblock = 0;
	pp = 1;
	memset(v, 0, sizeof(v));
	memset(block, 0, sizeof(block));
	for (i = 1; i <= n; i++)
		if (!v[i]) dfs1(i);
	for (i = n; i >= 1; i--)
		if (v[pos[i]]) {
			int ret = dfs2(pos[i], pos[i]);
			nblock++;
			if (!ret) return 0;
		}
	return 1;
}
예제 #11
0
 void dfs1(int u,int d){
     dep[u] = d;sz[u] = 1;son[u] = -1;
     int mx = 0;
     for(int i = head[u];~i;i = nxt[i]){
         Edge& ed = e[i];
         if(ed.v==fa[u]) continue;
         fa[ed.v] = u;
         dfs1(ed.v,d+1);
         sz[u]+=sz[ed.v];
         if(mx<sz[ed.v]){
             son[u] = ed.v;
             mx = sz[ed.v];
         }
     }
 }
예제 #12
0
int ok(int ii,int now)
{
	int st=0,dig=now/three[8-ii];
	for(int i=0; i<9; i++)
		st<<=1,st+=(now%3>0),now/=3;
	if(can[ii][st]>=0)
		return can[ii][st];
	if(dig%3==0)
		return can[ii][st]=0;
	for(int i=0; i<9; i++)
		vis[i/3][i%3]=(st&(1<<i));
	vis[ii/3][ii%3]=0;
	if(dfs1(ii/3,ii%3))
		return can[ii][st]=1;
	return can[ii][st]=0;
}
예제 #13
0
파일: SCC.cpp 프로젝트: iduru/Library
 /* 強連結成分分解後の各頂点のトポロジカル順序を返す */
 vector<int> solve() {
     used = new bool[V];
     fill(used, used + V, false);
     vs.clear();
     for (int v = 0; v < V; v++) {
         if (!used[v]) dfs1(v);
     }
     fill(used, used + V, false);
     int k = 0;
     vector<int> Ret(V, -1);
     for (int i = vs.size() - 1; i >= 0; i--) {
         if (!used[vs[i]]) dfs2(vs[i], k++, Ret);
     }
     delete[] used;
     return Ret;
 }
예제 #14
0
 void scc(){
     for(int x = 0; x < Vsize; x++){
         if(!visited[x]) dfs1(x);
     }
     transpose();
     for(int i = 0; i < Vsize; i++){
         visited[i] = false;
     }
     while(!st.empty()){
         int u = st.top();
         st.pop();
         if(!visited[u]) dfs2(u);
         std::cout << std::endl;
     }
     std::cout << std::endl;
 } 
예제 #15
0
void dfs1(int x)
{
	siz[x] = 1;
	son[x] = 0;
	for (int i = head[x]; i != -1; i = edge[i].next)
	{
		int &u = edge[i].to;
		if (u != fa[x])
		{
			fa[u] = x;
			deep[u] = deep[x] + 1;
			dfs1(u);
			siz[x] += siz[u];
			if (siz[son[x]] < siz[u]) son[x] = u;
		}
	}
}
void dfs1(int root)
{
    int son,i,size=map[root].size();
    for(i=0;i<size;i++)
    {
        son=map[root][i];
        dfs1(son);
        if(longest[son]+length[son] > longest[root])
        {
            second[root]=longest[root];
            longest[root]=longest[son]+length[son];
            longid[root]=son;
        }
        else if(longest[son]+length[son] > second[root])
            second[root]=longest[son]+length[son];
    }
}
예제 #17
0
int main(){
	while(scanf("%d",&n),n){
		sum=mx=0;
		for(ni=0;ni<n;ni++){
			scanf("%d",&ar[ni]);
			sum+=ar[ni];
			if(mx<ar[ni])mx=ar[ni];
		}
		std::sort(ar,ar+n);
		for(j=mx;j*2<=sum;j++){
			if(j==sum||(sum%j==0&&dfs1(j,0,n,n))){
				printf("%d\n",j);
				break;
			}
		} 
	}
}
예제 #18
0
파일: 2599.cpp 프로젝트: Eopxt/OI
void work(int x) {
    v[0] = now = x + 1;
    for (int k = h[x]; ~k; k = nxt[k])
        if (mk[k]) {
            d[p[k]] = w[k];
            e[p[k]] = 1;
            dfs1(p[k], x);
            dfs2(p[k], x);
        }
    findroot(x, n);
    for (int k = h[x]; ~k; k = nxt[k])
        if (mk[k]) {
            mk[k ^ 1] = false;
            f[n] = size = s[p[k]];
            findroot(p[k], cur = n);
            work(cur);
        }
}
예제 #19
0
파일: standard_0.cpp 프로젝트: VarickQ/ACM
void precut()
{
    memset(visit,0,sizeof(visit));
    memset(visite,0,sizeof(visite));
    memset(bridge,0,sizeof(bridge));
    memset(cut,0,sizeof(cut));
    for(int i=0;i<n;i++)
     if (!visit[i])
     {
         root=i;
         dfs1(i,-1,0);
     }
    memset(de,0,sizeof(de));
    for(int i=0;i<cnt;i++)
        de[e[i].to]++;
    for(int i=0;i<n;i++)
        if (de[i]==1) cut[i]=1;
}
예제 #20
0
void dfs1(int x, int Fa) {
	fa[x] = Fa;
	siz[x] = 1;
	dep[x] = dep[Fa] + 1;
	int max_size = 0;
	for (int i = lst[x]; i; i = nxt[i]) {
		int y = id[i];
		if (y != Fa) {
			path[y] = i; //-----------------
			dfs1(y, x);
			if (siz[y] > max_size) {
				max_size = siz[y];
				hvy[x] = y;
			}
			siz[x] += siz[y];
		}
	}
}
예제 #21
0
파일: main.cpp 프로젝트: EyciaZhou/acm-fake
	int dfs1(int n, int f) {
		dep[n] = dep[f]+1;
		fa[n] = f;
		int tot = 0;
		int tmp, p = 0, k = 0;
		if (g3[n].size() > 0) {
			for (int i = 0; i < g3[n].size(); i++) {
				tmp = dfs1(g3[n][i], n);
				if (tmp > k) {
					k = tmp;
					p = g3[n][i];
				}
				tot += tmp;
			}
		}
		hson[n] = p;
		return siz[n] = tot+1;
	}
예제 #22
0
void dfs1(int u, int father, int d)
{
	dep[u] = d;
	fa[u] = father;
	siz[u] = 1;
	for (int i = he[u]; ~i; i = next[i])
	{
		int v = to[i];
		if (v != father)
		{
			dfs1(v, u, d + 1);
			siz[u] += siz[v];
			if (son[u] == -1 || siz[v] > siz[son[u]])
			{
				son[u] = v;
			}
		}
	}
}
int main()
{
    int i,fa,len;
    while(scanf("%d",&n)!=EOF)
    {
        chu();
        for(i=2;i<=n;i++)
        {
            scanf("%d%d",&fa,&len);
            map[fa].push_back(i);
            length[i]=len;
        }
        dfs1(1);
        dfs2(1);
        for(i=1;i<=n;i++)
            printf("%d\n",max(longest[i],shang[i]));
    }
    return 0;
}
예제 #24
0
파일: d.cpp 프로젝트: wcwswswws/MyCode
int main()
{
    tot=0;
    scanf("%d",&n);
    for (int i=1;i<n;i++)
    {
        int x,y;scanf("%d%d",&x,&y);
        e[++tot][0]=y;
        e[tot][1]=v[x];
        v[x]=tot;
        e[++tot][0]=x;
        e[tot][1]=v[y];
        v[y]=tot;
    }
    dfs1(1,0);
    dfs2(1,0);ans+=ans;
    printf("%I64d\n",ans);
    return 0;
}
예제 #25
0
파일: d.cpp 프로젝트: wcwswswws/MyCode
void dfs1(int o,int fa)
{
    tr[o].size=1;tr[o].len=0;
    int j=v[o];
    long long tmp=0;
    while (j!=0)
    {
        if (e[j][0]!=fa)
        {
            int k=e[j][0];
            dfs1(k,o);
            ans+=tmp*tr[k].len;
            tmp+=tr[k].len;
            tr[o].len+=tr[k].len;
            tr[o].len+=tr[o].size*tr[k].size;
            tr[o].size+=tr[k].size;
        }
        j=e[j][1];
    }
}
예제 #26
0
파일: poj2446.cpp 프로젝트: tommy5198/acm
void init(){
    scanf("%d%d%d", &n, &m, &k);
    for(int i=0; i<k; i++){
        int ta, tb;
        scanf("%d%d", &ta, &tb);
        mat[tb][ta] = -1;
    }
    if( (n*m-k)%2 ) return ;
    for(int i=0; i<=n+1; i++)
        mat[i][0] = mat[i][m+1] = -1;
    for(int i=0; i<=m+1; i++)
        mat[0][i] = mat[n+1][i] = -1;
    l = r = 1;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            if(!mat[i][j]){
                mat[i][j] = l++;
                dfs1(i, j, l-1, false);
            }
}
int main(){
    scanf("%d%d%d",&N,&M,&R);
    for(int i=1,a,b;i<N;++i){
        scanf("%d%d",&a,&b);
        adj[a].emplace_back(b);
        adj[b].emplace_back(a);
    }
    for(int i=1;i<=N;++i){
        scanf("%d",col+i);
        vals[i-1]=col[i];
    }
    std::sort(vals,vals+N);
    valcnt=std::unique(vals,vals+N)-vals;
    for(int i=1;i<=N;++i)
        col[i]=std::lower_bound(vals,vals+valcnt,col[i])-vals;
    for(int i=0,a;i<M;++i){
        scanf("%d",&a);
        qrys[a].emplace_back(i);
    }
    dfs1(R,-1);
    dfs2(R,-1);
    for(int i=0;i<M;printf("%d\n",ans[i++]));
}
예제 #28
0
파일: standard_0.cpp 프로젝트: VarickQ/ACM
void dfs1(int u,int fa,int time)
{
    int num=0,first=0;

    id[u]=low[u]=++time;
    visit[u]=1;
    for(int p=box[u];p!=-1;p=e[p].next)
    {
        int v=e[p].to;

        if (v==fa)
        {
            first++;
            if (first==1) continue;
        }
        if (!visit[v])
        {
            num++;
            dfs1(v,u,time);
            ckmin(low[u],low[v]);
            if (low[v]==id[v]&&u!=root)
                cut[u]=1;
            if (id[u]==low[v]&&u!=root)
                cut[u]=1;
        } else
        {
            ckmin(low[u],id[v]);
        }
        if (id[u]<low[v])
        {
            bridge[p]=1;
        }
    }
    if (u!=root&&id[u]==low[u])
        cut[u]=1;
    if (u==root&&num>1) cut[u]=1;
}
예제 #29
0
파일: uva10349.cpp 프로젝트: tommy5198/acm
void init(){
    scanf("%d%d", &n, &m);
    memset(e, false, sizeof(e));
    memset(mat, -1, sizeof(mat));
    memset(L, -1, sizeof(L));
    memset(R, -1, sizeof(R));
    ttl = 0;
    for(int i=1; i<=n; i++){
        getchar();
        for(int j=1; j<=m; j++)
            if(getchar() == '*'){
                mat[i][j] = 0;
                ttl++;
            }
    }
    
    l = r = 1;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            if(!mat[i][j]){
                mat[i][j] = l++;
                dfs1(i, j, l-1, true);
            }
}
예제 #30
0
int main(void)
{
    while(scanf("%d %d",&n,&m)!=EOF&&!(n==0&&m==0))
    {
       int i;
       for(i=0;i<n;i++)
         tail[i]=-1,tail2[i]=-1,use[i]=0;
       for(i=0;i<m;i++)
       {
          int a,b;
          scanf("%d %d",&a,&b);
          edge_to[i]=b;
          edge_next[i]=tail[a];
          tail[a]=i;
          
          edge_to2[i]=a;
          edge_next2[i]=tail2[b];
          tail2[b]=i;
       }
       x=0;
       for(i=0;i<n;i++)
         if(use[i]==0)
           dfs1(i);
       for(i=0;i<n;i++)
         use[i]=0;
       g=0;
       for(i=x-1;i>=0;i--)
         if(use[tp[i]]==0)
         {
           g++;
           dfs2(tp[i]);
         }
       printf("%d\n",g);
    }
    return 0;
}