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"); } }
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); } }
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; }
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; }
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; }