#include #define MAXKRIZ 100 struct kriz { int cn; /* Počet cest z dané křižovatky */ int byl; /* Byli jsme již v dané křižovatce? */ int h; /* Hodnota přidělená křižovatce při prohledávání do hloubky */ int s[MAXKRIZ]; /* Čísla křižovatek, se kterými je tato spojena */ }; int n, m; /* Počet křižovatek; Počet silnic */ struct kriz k[MAXKRIZ]; /* Jednotlivé křižovatky */ /* Načte vstup */ void nacti(void) { int i; int a, b; printf("Pocet krizovatek: "); scanf("%d", &n); printf("Pocet silnic: "); scanf("%d", &m); for (i = 0; i < n; i++) { k[i].cn = 0; k[i].byl = 0; } for (i = 0; i < m; i++) { printf("Zadejte cestu: "); scanf("%d %d", &a, &b); a--; b--; /* Přidáme silnice do seznamu */ k[a].s[k[a].cn++] = b; k[b].s[k[b].cn++] = a; } } /* Vypíše síť jednosměrek */ void vypis(void) { int i, j; for (i = 0; i < n; i++) /* Pro všechny křižovatky */ for (j = 0; j < k[i].cn; j++) /* Pro všechny silnice z ní */ if (k[i].h < k[k[i].s[j]].h) /* Abychom silnici vypsali jen jednou... */ /* Šli jsme po této silnici při prohledávání přímo? */ if (k[i].h + 1 == k[k[i].s[j]].h) printf("%d -> %d\n", i+1, k[i].s[j]+1); else printf("%d -> %d\n", k[i].s[j]+1, i+1); } /* Vrátí, zda jsme byli všude */ int vsude(void) { int i; for (i = 0; i < n; i++) if (!k[i].byl) return 0; return 1; } /* Prohledávání do hloubky -- z vrcholu V, předchozí vrchol byl PREV, prohledali jsme již H vrcholů */ int prohledej(int v, int prev, int h) { int i, minh = h, acth; /* ; Minimální dosud vrácená hodnota; Aktuálně vrácená hodnota */ k[v].byl = 1; k[v].h = h; for (i = 0; i < k[v].cn; i++) { /* Projdeme všechny sousedy */ if (k[k[v].s[i]].byl) { /* Byli jsme už v daném vrcholu? */ /* Dostali jsme se výše (a nevraceli jsme se)? */ if (k[k[v].s[i]].h < minh && k[v].s[i] != prev) minh = k[k[v].s[i]].h; /* Zapamatujeme si lepší hodnotu */ } else { /* Necháme prohledat souseda */ acth = prohledej(k[v].s[i], v, h + 1); if (acth == -1) /* Není už nějaká větev problematická? */ return -1; if (acth < minh) minh = acth; } } if (minh >= h) /* Nevedla žádná cesta nad nás? */ return -1; return minh; } int main(void) { nacti(); if (!k[0].cn && n != 1) /* Izolovaná křižovatka ve větší síti? */ puts("System jednosmerek neexistuje."); else { /* V kořeni prohledávání jsme už byli... */ k[0].byl = 1; k[0].h = 0; /* Byl problém někde níže, nebo je síť nesouvislá? */ if (prohledej(k[0].s[0], 0, 1) == -1 || !vsude()) puts("System jednosmerek neexistuje."); else vypis(); } return 0; }