/* Nemes Tihamér - 2011/2012 3. korcsoport 3. forduló 2. feladat (Beküldte: N.T.)*/ import java.io.*; import java.util.*; class Pont { // a fa egy csúcsának id-ja public int id, tav; // a csúcs haszna Pont apa ; // apa a szélességi feszítőfában boolean megjelolt; // ezt használjuk a csúcs megjelöléséhez a bejáránál Queue szomszedok = new LinkedList(); // a csúcs szomszédainak listája, ők szintén csúcsok Pont(int i) { // konstruktor this.id=i ; // a csúcs id-ja this.tav=0 ; // a távolság kezdetben 0, majd felülírjuk ahol kell } } public class f4 { public static void main(String args[]) throws IOException { int N, R, i, j, f, c ; File file = new File("input.txt"); // az input fájl megnyitása Scanner inputFile = new Scanner(file); N=inputFile.nextInt(); // csúcsok száma R=inputFile.nextInt(); // kiszolgálók száma Pont p,q ; // két db, csúcsot tárolni képes változó Pont legmesszebbipont=new Pont(0) ; Pont[] pontok = new Pont[N]; // a csúcsokat tároló tömb (hogy konstans időben el lehessen érni egy csúcsot) for(i = 0; i < N; i++) pontok[i] = new Pont(i); // töltsük is fel csúcsokkal és mindegyikhez a megfelelő id küldjük Queue queue = new LinkedList(); // sor a szélességi bejáráshoz for(i = 0; i < R; i++) { // az R db szerver lesz a szélességi bejárás kezdő csúcsa j=inputFile.nextInt()-1 ; // beolvassuk a afájlból a szervereket queue.add( pontok[j] ); // mehet a sorba az összes kiszolgáló pontok[j].megjelolt=true ; // és meg is jelöljük, hiszen itt már jártunk (most) pontok[j].apa=pontok[j] ; // az apjuk saját maguk a kiírási követelmény miatt } for (f = 0; f < N; f++) { // most jöhet az élek beolvasása a fájlból minden csúcshoz c=inputFile.nextInt() ; // az adott csúcshoz az első szomszéd csúcs while (c!=0) { // ha van *(több)* szomszéd pontok[f].szomszedok.add(pontok[c-1]) ; // le is él pontok[c-1].szomszedok.add(pontok[f]) ; // fel is él c = inputFile.nextInt() ; // beolvassuk a következő szomszédot *()* } } while (queue.size() != 0) { // ciklus amíg van mit kivenni a prisorból p=queue.poll() ; // p-be kivesszük a következő bejárandó csúcsot Iterator it=p.szomszedok.iterator(); // iterátor a szomszédok bejárásához while(it.hasNext()) { // amíg van p-nek szomszédja q=(Pont)it.next() ; // legyen q a p aktuális szomszédja if (!q.megjelolt) { // ha q nem megjelölt, itt még nem jártunk q.apa=p ; // q apja p q.tav=p.tav+1 ; // a q távolsága éppen egyel nagyobb mint az apja távolsága q.megjelolt=true ; // megjelöljük hogy itt jártunk queue.add( q ); // és mehet a sorba legmesszebbipont=q ; // a legmesszebb lévő csúcs az utolsó lesz a bejárásban } } } System.out.println(legmesszebbipont.tav) ; // ki kell írni a legmesszebbi csúcs távolságát for (f = 0; f < N; f++) { // és ki kell írni az összes csúcsra System.out.print(pontok[f].tav) ; // a legközelebbi szervertől való távolságát System.out.print(" ") ; // és (szóközzel elválasztva) if (pontok[f].apa==null) System.out.println(0) ; // ha nincs útvonal akkor 0 0 -t kell kiírni else System.out.println(pontok[f].apa.id+1) ; // egyébként az apja id-jét } } }