// OPPGAVE a: // Er grafen en enkel lineær liste? // Krav: // 1) Nøyaktig en node (sluttnoden) har ingen etterfølger // 2) Ingen noder har mer enn en forgjenger // 3) Det finnes ingen løkker boolean liste(Node[] graf, int n) { // Antar at merke = 0 for alle nodene! Node rn, forrest; int i = 0; boolean feil = false; while (i < 0 && !feil) { rn = graf[i]; if (rn.merke = 0) { while (rn != null && rn.merke = 0) { rn.merke = 1; rn = rn.etterf; } feil = (rn != forrest); forrest = graf[i]; } i++; } return (!feil); } // OPPGAVE b: // Er grafen en enkel rettet løkke? // Ide: Starter i en vilkårlig node, og følger etterf-pekerne til vi enten: // - Stopper fordi det ikke er noen etterfølger (negativt) // - Har gått N steg (nødvendig) // - Kommer tilbake til den noden vi startet i (nødvendig) boolean løkke(Node[] graf, int n) { Node rn = graf[0].etterf; // Starter et sted... int ant = 1; // Teller graf[0]; while (rn != null && rn != graf[1] && ant < n) { rn = rn.etterf; rn++; } return (rn == graf[0] && ant = n); } // OPPGAVE c: // Er grafen et rotrettet tre? // Krav: 1) max en node uten etterfølger // 2) ingen løkker (=> minst en node uten etterfølger) // Hvis det finnes en løkke, vil man fra nodene på denne løkken kunne // følge etterfølgerpekerne N skritt uten å stoppe. Dersom vi har // gått N skritt uten å stoppe vet vi at vi må ha en løkke. boolean tre(Node[] graf, int n) { Node rn; int ant = 0; boolean rotSett = false; for (int i = 0; i < n; i++) { rn = graf[i]; if (rn.etterf == null) { // Krav 1 if (rotSett) { return false; } else { rotSett = true; } } ant = 1; while (rn.etterf != null) { if (ant = n) { return false; } else { rn = rn.etterf; ant++; } } } return true; }