Ejemplo n.º 1
0
void process() {
    int i;
    if (c != 0) printf("\n");
    c++;
    printf("CASE %d\n", c);
    for (i = 0; i < n; i++) {
        scanf("%d", input + i);
        input[i]--;
        parent[i] = -1;
    }
    init();
    scanf("%d", &m);
    int u, v;
    for (i = 0; i < m; i++) {
        scanf("%d%d", &u, &v);
        u--;
        v--;
        searchtree(0, n - 1, u, v, u, v);
        unionset(u, v);
    }
    scanf("%d", &k);
    for (i = 0; i < k; i++) {
        scanf("%d%d", &u, &v);
        u--;
        v--;
        if (find(u) == find(v)) printf("YES\n");
        else printf("NO\n");
    }
}
Ejemplo n.º 2
0
Grafo* kruskal(Grafo* grafo) {

    sortGrafo(grafo);

    Grafo *grafoMinimo = (Grafo*) malloc(sizeof(Grafo));
    grafoMinimo->verticesQtd = grafo->verticesQtd;
    grafoMinimo->arestasQtd = grafoMinimo->verticesQtd-1;
    grafoMinimo->arestas = (Aresta**)malloc(sizeof(Aresta*) * grafoMinimo->arestasQtd);
    grafoMinimo->vertices = (Vertice**)malloc(sizeof(Vertice*) * grafoMinimo->verticesQtd);
    for(int i = 0;i < grafoMinimo->verticesQtd; i++)
    {
        grafoMinimo->vertices[i] = grafo->vertices[i];
    }

    int elementos = 0;

    for(int i = 0;i < grafo->arestasQtd; i++)
    {
        if(find_set(grafo->arestas[i]->origem) != find_set(grafo->arestas[i]->destino))
        {
            unionset(grafo->arestas[i]->origem, grafo->arestas[i]->destino);
            grafoMinimo->arestas[elementos++] = grafo->arestas[i];
        }
    }


    return grafoMinimo;
}
 void dfs(DirectedGraphNode* u, int u_lab, vector<DirectedGraphNode*>& nodes, int &cnt){
     int m = u->neighbors.size();
     for(int i = 0; i < m; ++ i){
         DirectedGraphNode* v = u->neighbors[i];
         int v_lab = v->label;
         bool do_dfs = false;
         if(fa.find(v_lab) == fa.end()){
             fa[v_lab] = v_lab;
             ++ cnt;
             do_dfs = true;
         }
         if(find(u_lab) != find(v_lab)){
             -- cnt;
             unionset(u_lab, v_lab);
         }
         if(do_dfs)
             dfs(v, u_lab, nodes, cnt);
     }
 }
Ejemplo n.º 4
0
int main() {

	char type;
	int i, P;
	for (i = 1; i < MAX_CUBES; i++) {
		par[i] = i;
		size[i] = 1;
		pos[i] = 1;
	}

	scanf("%d\n", &P);
	int x, y, target;
	for (i = 0; i < P; i++) {
		scanf("%c", &type);
		if (type == 'M') {
			
			scanf("%d %d\n", &x, &y);
			unionset(x, y);

		} else {

			scanf("%d\n", &target);
			printf("%d\n", count(target));

			// // for(i = 0; i < 32: i++) {
			// 	printf("tar = %d\n", target);
			// 	printf("pos%d = %d\n", target, pos[target]);
			// 	printf("par%d = %d\n", target, par[target]);
			// 	printf("size%d = %d\n", par[target], size[par[target]]);
			// // }

			// for (int j = 0; j < 32; j++) {
			// 	// printf("tar = %d\n", target);
			// 	// printf("pos%d = %d\n", target, pos[target]);
			// 	// printf("par%d = %d\n", target, par[target]);
			// 	printf("size%d = %d\n", j, size[j]);
			// }

		}
	}
	return 0;
}
Ejemplo n.º 5
0
int main()
{
	scanf("%d %d", &N, &K);
	for (int i = 0; i < N; ++i)
		scanf("%s", s[i]);
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j)
			sum[i + 1][j + 1] = sum[i][j] - sum[i + 1][j] - sum[i][j + 1] + (s[i][j] == '.');
	for (int i = 0; i < N * N; ++i)
		p[i] = i, cnt[i] = 1;
	for (int i = 0; i < N; ++i)
		for (int j = 0; j < N; ++j)
			if (s[i][j] == '.')
			{
				for (int k = 0; k < 4; ++k)
				{
					int ni = i + dx[k];
					int nj = j + dy[k];
					if (ni >= 0 && ni < N && nj >= 0 && nj < N)
						unionset(idx(i, j), idx(ni, nj));
				}
			}
	int tim = 1;
	int mx = 0;
	for (int i = 0; i < N - K + 1; ++i)
		for (int j = 0; j < N - K + 1; ++j)
		{
			int ans = 0;
			if (i > 0)
			{
				for (int k = 0; k < K; ++k)
				{
					int id = vis[findset(idx(i - 1, j + k))];
					if (id != tim)
					{
						id = tim;
						ans += cnt[findset(id)];
					}
				}
			}
			if (j > 0)
			{
				for (int k = 0; k < K; ++k)
				{
					int id = vis[findset(idx(i + k, j - 1))];
					if (id != tim)
					{
						id = tim;
						ans += cnt[findset(id)];
					}
				}
			}
			if (i + K < N)
			{
				for (int k = 0; k < K; ++k)
				{
					int id = vis[findset(idx(i + K, j + k))];
					if (id != tim)
					{
						id = tim;
						ans += cnt[findset(id)];
					}
				}
			}
			if (j + K < N)
			{
				for (int k = 0; k < K; ++k)
				{
					int id = vis[findset(idx(i + k, j + K))];
					if (id != tim)
					{
						id = tim;
						ans += cnt[findset(id)];
					}
				}
			}
			++tim;
		}
	return 0;
}
Ejemplo n.º 6
0
int main()
{
	int t,n,i,j,k,p,s,e,x,y,c,ans,f,d;

	for(i=0;i<100;i++)
		check[i]=0;
	prime[0]=2;
	c=genprime(1000000);
//	printf("%d\n",prime[c-1]);
//	printf("%d\n",c);
//	for(i=0;i<c;i++)
//		printf("%d ",prime[i]);
//	printf("\n");

	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %lld %d",&n,&m,&p);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&tazo[i]);
			a[i].root=i;
			a[i].wt=tazo[i];
			a[i].count=1;
		}
		for(i=0;i<m;i++)
		{
			scanf("%d %d",&s,&e);

			x=find(s);
			y=find(e);
//			printf("%d %d\n",x,y);
			if(x!=y)
			{
				unionset(x,y);
			}
		}
		ans=0;
		for(i=1;i<=n;i++)
		{
//			printf("%d %d %d %d\n",i,a[i].root,a[i].wt,a[i].count);
			if(a[i].root==i)
			{
				f=0;
				d=(a[i].wt+p);
				for(j=0;j<c;j++)
				{
					if(d==prime[j])
					{
						f=1;
						break;
					}
				}
//				printf("f : %d\n",f);
				if(f==1)
				{
					ans++;
				}
			}
		}
		printf("%d\n",ans);
	}
	
	return 0;
}