All pastes #501130 Raw Edit

Untitled

public text v1 · immutable
·published 2007-05-21 21:44 UTC
rendered paste body
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct {
	int polaczenia[20];
	int stopien;
	int odwiedzony;
	int lewy, prawy;
	int NL, NP;
} punkt;

inline int min(int, int);
void oblicz(punkt *, punkt *);
	
punkt punkty[100];

int main () {

	int t, n, ilosc, ilosc_prev, a, b, max_t;
	scanf("%d", &t);
	max_t = t;
	getchar();

	while(t--) {
		if (max_t != t+1)
			ilosc_prev = ilosc;

		scanf("%d", &ilosc);
		getchar();
		
		if (max_t == t+1)
			ilosc_prev = 0;
		for (n=0; n < ilosc+1; n++) { //inicjacja zmiennych
			punkty[n].stopien = 0;
			punkty[n].odwiedzony = 0;
			punkty[n].lewy = punkty[n].prawy = 0;
			punkty[n].NL = punkty[n].NP = 1;
		}
		punkty[0].odwiedzony = 1;
		for (n=0; n < ilosc-1; n++) {

			scanf("%d %d", &a, &b);
			getchar();

			punkty[a].polaczenia[punkty[a].stopien] = b;
			punkty[b].polaczenia[punkty[b].stopien] = a;
			punkty[a].stopien++;
			punkty[b].stopien++;
		}

		oblicz(&punkty[1], 0);
		
		if (punkty[1].lewy > punkty[1].prawy) {
			printf("%d %d\n", punkty[1].prawy, (punkty[1].NP > 10007) ? punkty[1].NP%10007 : punkty[1].NP);
		} else if (punkty[1].lewy < punkty[1].prawy) {
			printf("%d %d\n", punkty[1].lewy, (punkty[1].NL > 10007) ? punkty[1].NL%10007 : punkty[1].NL);
		} else {
			printf("%d %d\n", punkty[1].lewy, ((punkty[1].NL+punkty[1].NP) > 10007) ? (punkty[1].NL+punkty[1].NP)%10007 : punkty[1].NL+punkty[1].NP);
		}
	}
	return 0;
}

void oblicz(punkt * syn, punkt * rodzic) { //oblicza lewe i prawe wartosci dla podanego punktu
	int n, suma;
	int * pol;
	
	syn->odwiedzony = 1;
	
	pol = syn->polaczenia;
	for (n = 0; n < syn->stopien; n++) {
		if (punkty[pol[n]].odwiedzony!=1) {
			oblicz(&punkty[pol[n]], syn);
		}
	}
	syn->lewy++;
	if (rodzic) {

		rodzic->NP*=syn->NL;
		if (rodzic->NP > 10007)
			rodzic->NP%=10007;
		
		if (syn->lewy > syn->prawy) {
			rodzic->NL*=syn->NP;
			if (rodzic->NL > 10007)
				rodzic->NL%=10007;
		} else if (syn->lewy < syn->prawy) {
			rodzic->NL*=syn->NL;
			if (rodzic->NL > 10007)
				rodzic->NL%=10007;
		} else {
			rodzic->NL*=(syn->NL+syn->NP);
			if (rodzic->NL > 10007)
				rodzic->NL%=10007;
		}
		rodzic->prawy += syn->lewy;
		rodzic->lewy += min(syn->prawy,syn->lewy);
	}
}

inline int min(int a, int b) {
	return ((a > b) ? b : a);
}