#include #include #define MAX_H 1000000 #define MAX_V 1001 int Hran,Vrcholu; int Hrany[MAX_V][MAX_V]; // seznam hran pro každý vrchol int StupenVrcholu[MAX_V]; // stupně jednotlivých vrcholů int Navstiveno[MAX_V]; // seznam již navštívených vrcholů // obsahuje buď nulu, nebo hloubku rekurze, ve které jsme vrchol navštívili int Zacatek,Konec; // Začátek a konec právě načítané hrany int i; int VypisMostyVKomponente(int Vrchol, int OdkudJdu, int Hloubka) { // projde všechny hrany vedoucí z daného vrcholu (kromě té, po které se sem došlo) // vrací hloubku, kam až se v rekurzi dostal nějakým cyklem // pokud nějaký vrchol ještě není prozkoumaný, rekurzivně se na něj zavolá int k; int MinimalniHloubka; int NovyCyklus; Navstiveno[Vrchol] = Hloubka; // označení v jaké hloubce jsme se sem dostali MinimalniHloubka = Vrcholu+1; // není cyklus (pracovní nekonečno ...) for (k = 0; k < StupenVrcholu[Vrchol]; k++) if (Hrany[Vrchol][k] != OdkudJdu) { // projdeme hrany, po kterých jsme sem nepřišli if (Navstiveno[Hrany[Vrchol][k]] == 0) { // pokud ještě nebyl tenhle vrchol navštíven NovyCyklus = VypisMostyVKomponente(Hrany[Vrchol][k],Vrchol,Hloubka+1); if (NovyCyklus > Hloubka) printf("%d %d\n",Vrchol,Hrany[Vrchol][k]); // rekurzivně zjistíme, kam až sahaji cykly a případně nahlásíme most } else NovyCyklus = Navstiveno[Hrany[Vrchol][k]]; // a pokud jsme tu již byli koukneme se kdy if (MinimalniHloubka > NovyCyklus) MinimalniHloubka = NovyCyklus; } return MinimalniHloubka; // a vrátíme délku nejdelšího cyklu, jaký jsme našli }; int main() { scanf("%d%d",&Vrcholu,&Hran); if (Vrcholu>=MAX_V || Hran>MAX_H) { printf("Chybny vstup.\n"); return 1; } for (i=1; i<=Vrcholu; i++) { StupenVrcholu[i] = 0; Navstiveno[i] = 0; } // vynulování for (i=0; iVrcholu || Zacatek<1 || Konec>Vrcholu || Konec<1) { printf("Chybny vstup.\n"); return 1; } Hrany[Zacatek][StupenVrcholu[Zacatek]++] = Konec; Hrany[Konec][StupenVrcholu[Konec]++] = Zacatek; } // načtení vstupu a vytvoření seznamů sousedů daných vrcholů printf("Vysledny seznam:\n"); for (i = 1; i<=Vrcholu; i++) if (Navstiveno[i]==0) VypisMostyVKomponente(i,-1,1); // projdeme všechny komponenty spojitosti a na každé spustíme průchod do hloubky return 0; }