/*
feladat: S88
név: Makk László
osztály: 12
iskola: SZTE Ságvári Endre Gyakorló Gimnázium
város: Szeged
*/

A program C++ nyelven lett írva, CodeBlocks 13.12-es fejlesztői környezetben (GNU GCC fordító).

Az algoritmus:
	A bemeneti gráfot összefüggő részgráfokra bontjuk (pl. BFS, azaz széltében kereséssel).
	Mindegyikre külön kiszámítjuk hányféleképpen lehet irányítottá tenni, és ezek szorzata (modulo ...)
	lesz az eredmény.	Egy ilyen komponens esetén a következő esetek vannak:
	- Nincs benne kör, azaz fa. Ekkor keresett szám a csúcsok száma. Bármelyik csúcs lehet a
	gyökér, és innentől egyértelmű az irányítás. Egy csúcsból annak "apjába" mutat az él.
	- Pontosan egy kör van benne, és ez nem hurokél. Ekkor a keresett szám a 2. A kört kétféleképpen
	irányíthatjuk, és az összes többi él ehhez kell hogy alkalmazkodjon.
	- Pontosan egy kör van benne, és ez hurokél. A keresett szám az 1. Ez az eset igazából egy fa, plusz
	egy hurokél, de a hurokél miatt, a gyökér meghatározott.
	- Legalább 2 kör van benne. Ekkor megmutatható, hogy nem lehet megfelelően irányítani a komponens,
	s így az egész gráf éleit.
	
	A BFS az élek számára nézve lineáris idejű. Az esetek elkülönítése a BFS közben, csak a
	komplexitás konstans	szorzóját növelik:
	Figyeljük, hogy adott komponensben van-e hurokél, illetve számoljuk a csúcsokat (V), az éleket (E).
	Egy összefüggő gráf csak akkor fa, ha V=E+1. Pontosan akkor van benne pontosan egy kör, ha V=E.
	(Ezekről könnyen belátható, hogy igazak.)
	
	A futási idő ezek alapján O(M) lenne, de mivel M<N, O(N).
