Cod sursa(job #868944)

Utilizator sana1987Laurentiu Dascalu sana1987 Data 31 ianuarie 2013 19:52:17
Problema Paduri de multimi disjuncte Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.1 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N          200
#define MODULO   98999

static int s[N + 1][N + 1], S[N + 1][N + 1];

int sitrling_main() {
    freopen("stirling.in", "r", stdin);
    freopen("stirling.out", "w", stdout);

    memset(s, 0, sizeof(s));
    memset(S, 0, sizeof(S));

    s[1][1] = 1;
    S[1][1] = 1;

    int i, j;

    for (i = 2; i <= N; i++) {
    	for (j = 1; j <= i; j++) {
    		s[i][j] = (s[i - 1][j - 1] - (i - 1) * s[i - 1][j]) % MODULO;
    		S[i][j] = (S[i - 1][j - 1] + j * S[i - 1][j]) % MODULO;
    	}
    }

    int T;
    scanf("%d\n", &T);

    for (i = 0; i < T; i++) {
    	int x, n, m;
    	scanf("%d %d %d\n", &x, &n, &m);
    	if (x == 1) {
    		printf("%d\n", s[n][m]);
    	}
    	else if (x == 2) {
    		printf("%d\n", S[n][m]);
    	}
    }

    return 0;
}

typedef struct uf_node_ {
	int rank;
	struct uf_node_ *parent;
} uf_node;

uf_node *new_node() {
	uf_node *node = (uf_node *) malloc(sizeof(uf_node));
	node->rank = 0;
	node->parent = node;
	return node;
}

uf_node *data[100001];

void do_union(int x, int y) {
	uf_node *nx = data[x];

	while (nx != nx->parent) nx = nx->parent;

	uf_node *ny = data[y];

	while (ny != ny->parent) ny = ny->parent;

	if (nx->rank < ny->rank) {
		nx->parent = ny;
		ny->rank++;
	}
	else {
		ny->parent = nx;
		nx->rank++;
	}
}

int do_find(int x, int y) {
	uf_node *nx = data[x];

	while (nx != nx->parent) nx = nx->parent;

	uf_node *ny = data[y];

	while (ny != ny->parent) ny = ny->parent;

	return nx == ny;
}

int union_find_main() {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    int n, m, i;
	int cod, x, y;
    scanf("%d %d\n", &n, &m);

    for (i = 1; i <= n; i++) {
    	data[i] = new_node();
    }

    for (i = 1; i <= m; i++) {
    	scanf("%d %d %d\n", &cod, &x, &y);
    	if (cod == 1) {
    		do_union(x, y);
    	}
    	else if (cod == 2) {
    		int result = do_find(x, y);
    		if (result)
    			printf("DA\n");
    		else
    			printf("NU\n");
    	}
    }

    return 0;
}


int main(int argc, char **argv) {
	//return stirling_main();
	return union_find_main();
}