All pastes #57350 Raw Edit

swiatlowody

public c v1 · immutable
#57350 ·published 2006-05-20 20:48 UTC
rendered paste body
#include <stdio.h>#define DO3 16581375#define DO2 65025#define DO1 255#define MOD 2000001unsigned long hash(unsigned long a);unsigned long FIND_SET(unsigned long set);unsigned long MAKE_SET(unsigned long IP1, unsigned long IP2);struct wierzcholek{    unsigned long SET;    unsigned long rank;} ELEMENT[MOD];int main(){    unsigned long ip1_1, ip1_2, ip1_3, ip1_4;    unsigned long ip2_1, ip2_2, ip2_3, ip2_4;    unsigned long IP1, IP2, key1, key2;    unsigned long i;    char znak;        for(i=0; i<MOD; i++)    {	ELEMENT[i].SET=MOD+1;	ELEMENT[i].rank=1;    }        while(scanf("%c", &znak)!=EOF)    {	scanf(" %lu.%lu.%lu.%lu", &ip1_1, &ip1_2, &ip1_3, &ip1_4);        key1=(ip1_1-1)*DO3 + (ip1_2-1)*DO2 + (ip1_3-1)*DO1 + ip1_4;	IP1=hash(key1);			scanf(" %lu.%lu.%lu.%lu\n", &ip2_1, &ip2_2, &ip2_3, &ip2_4);		key2=(ip2_1-1)*DO3 + (ip2_2-1)*DO2 + (ip2_3-1)*DO1 + ip2_4;		IP2=hash(key2);			if(znak=='B') /*budowanie drzewa*/	{	    if(ELEMENT[IP1].SET==MOD+1 && ELEMENT[IP2].SET==MOD+1)	    {		ELEMENT[IP1].SET=IP1;		ELEMENT[IP1].rank=2;				ELEMENT[IP2].SET=IP1;		ELEMENT[IP2].rank=2;		/*printf("FILIPEK1\t%lu set1=%lu rank%lu\t%lu set2=%lu rank%lu\n", IP1, ELEMENT[IP1].SET, ELEMENT[IP1].rank, IP2, ELEMENT[IP2].SET, ELEMENT[IP2].rank);*/	    }	    else if(FIND_SET(IP1)!=FIND_SET(IP2))	    {		/*printf("FIL2\t%lu set1=%lu rank%lu\t%lu set2=%lu rank%lu\n", IP1, ELEMENT[IP1].SET, ELEMENT[IP1].rank, IP2, ELEMENT[IP2].SET, ELEMENT[IP2].rank);*/		MAKE_SET(IP1, IP2);		/*printf("FIL2'\t%lu set1=%lu rank%lu\t%lu set2=%lu rank%lu\n", IP1, ELEMENT[IP1].SET, ELEMENT[IP1].rank, IP2, ELEMENT[IP2].SET, ELEMENT[IP2].rank);*/	    }	}	else /*zapytanie czy sa z tej samej sieci*/	{	    if(ELEMENT[IP1].SET!=MOD+1 && ELEMENT[IP2].SET!=MOD+1 && FIND_SET(IP1)==FIND_SET(IP2)) printf("%c\n", 'T');	    else printf("%c\n", 'N');	}	    	    /*printf("%lu.%lu.%lu.%lu %lu.%lu.%lu.%lu\n", ip1_1, ip1_2, ip1_3, ip1_4, ip2_1, ip2_2, ip2_3, ip2_4);*/	    /*printf("%c %lu %lu\t%lu %lu\t%lu %lu\n", znak, key1, key2, IP1, IP2, ELEMENT[10].SET, ELEMENT[100].rank);*/	    }        return 0;}unsigned long hash(unsigned long a){    a=a%MOD;        return a;}unsigned long FIND_SET(unsigned long set){    if(ELEMENT[set].SET==MOD+1) return MOD+1;    else    {	while(ELEMENT[set].SET!=set && ELEMENT[set].SET!=MOD+1)	{	    set=ELEMENT[set].SET;	}	return set;    }}unsigned long MAKE_SET(unsigned long IP1, unsigned long IP2){    unsigned long set1, set2;        set1=FIND_SET(IP1);    set2=FIND_SET(IP2);    if(set2==MOD+1) set2=IP2;    if(set1==MOD+1) set1=IP1;    if(ELEMENT[set1].rank==ELEMENT[set2].rank)    {	ELEMENT[set1].rank+=ELEMENT[set2].rank;	ELEMENT[set2].rank=ELEMENT[set1].rank;		ELEMENT[set1].SET=set1;	ELEMENT[IP1].SET=set1;	ELEMENT[set2].SET=set1;	ELEMENT[IP2].SET=set1;    }    else if(ELEMENT[set1].rank > ELEMENT[set2].rank)    {	ELEMENT[set1].rank+=ELEMENT[set2].rank;	ELEMENT[set2].rank=ELEMENT[set1].rank;	if(set2!=MOD+1) ELEMENT[set2].SET=set1;	else ELEMENT[IP2].SET=set1;	    }    else if(ELEMENT[set1].rank < ELEMENT[set2].rank)    {	ELEMENT[set2].rank+=ELEMENT[set1].rank;	ELEMENT[set1].rank=ELEMENT[set2].rank;	ELEMENT[set1].SET=set2;		ELEMENT[IP1].SET=set2;	ELEMENT[IP2].SET=set2;    }}