import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
//import java.util.Scanner;
import java.util.Arrays;
//City map #1: 1 camera(s) found
public class Main {
//private static Scanner sc = new Scanner(System.in);
static int pocetSpoju =1;
static DfsMatice base;
static int pocetSub;
static int pocitadloMest=0;
static int pocitadloKrizovatek=0;
static void zpracovani
(int pocetMest
) throws IOException { pocitadloMest++;
pocitadloKrizovatek=0;
localVystup="";
for(int i = 0 ; i < pocetMest ; i++){
vstup = vstup + bfr.readLine().trim()+" ";
}
//vstup = vstup + bfr.readLine().trim();
// System.out.println(vstup.trim());
String [] poleVstupu
= vstup.
trim().
split(" "); base.vytvoreniUzlu(poleVstupu);
pocetSpoju
= Integer.
valueOf(bfr.
readLine().
trim()); // System.out.println("pocetSpoju"+pocetSpoju);
//bfr.readLine();
for(int i = 0 ; i<pocetSpoju ; i++){
base.vytvoreniSpojeMaticeObousmerna(bfr.readLine().trim());
}
base.vytvoreniOrigMtice();
// base.vypisMaticeorig();
//base.vypisMatice();
base.prohledDoHloubky(0);
pocetSub =base.pocetSubGrafu;
//System.out.println(pocetSub);
base.prebileni();
for(int i = 0 ; i<poleVstupu.length ; i++){
vyhodnoceni(poleVstupu[i]);
}
vystup = vystup+"City map #"+pocitadloMest+": "+pocitadloKrizovatek+" camera(s) found"+"\n"+localVystup+"\n";
}
static void vyhodnoceni
(String vyhod
) { base.odeberSpoj(vyhod);
base.prohledDoHloubky(0);
//base.vypisMatice();
//base.vypisMaticeorig();
////System.out.println(base.pocetSubGrafu);
// System.out.println("base.pocetSubGrafu "+base.pocetSubGrafu+" "+"pocetSub "+pocetSub);
if(base.pocetSubGrafu>(pocetSub+1)){
localVystup = localVystup+vyhod+"\n";
pocitadloKrizovatek++;
}
base.prebileni();
base.origMatice();
}
bwr.print("line1\n");
base = new DfsMatice();
int pocet = 0;
while(true){
pocet
= Integer.
valueOf(bfr.
readLine().
trim()); //System.out.println("pocet"+pocet);
if(pocet!=0){
zpracovani(pocet); }
else{
break; } }
// System.out.print(vystup.trim());
//System.out.print("\n"+vystup.trim());
bwr.print("\n"+vystup.trim());
}
}
class Prvek {
public Hrana hrana;
//Prvek top;
public int vzdalenost;
public int predchudce;
public int objeven;
public int dokoncen;
this.nazev = nazev;
this.hrana = null;
this.color = "White";
this.
vzdalenost = Integer.
MAX_VALUE; this.predchudce = -1;
}
}
class Hrana {
public int vrchol;
public Hrana dalsi;
public Hrana (int vrchol) {
this.vrchol = vrchol;
dalsi = null;
} }
class DfsMatice {
private static int matSousednosti [][]; //matice souslednosti
private static int matSousednostiOrig [][];
public Prvek [] prvky; //pole objektu
public Prvek [] vystupni;
// private Prvek prac;
private static int cas = 0;
int pocetSubGrafu;
DfsMatice() {
this.prvky=null;
this.pocetSubGrafu=1;
}
void vytvoreniOrigMtice(){
matSousednostiOrig = new int [uzly.length][uzly.length];
for(int i = 0 ; i < prvky.length ; i++){
for(int j = 0 ; j < prvky.length ; j++){
matSousednostiOrig[i][j]=matSousednosti[i][j];
matSousednostiOrig[j][i]=matSousednosti[j][i];
}
}
}
void vytvoreniUzlu
(String[] pole
){ uzly = pole;
matSousednosti = new int [uzly.length][uzly.length];
prvky = new Prvek [pole.length];
for(int i = 0 ; i < pole.length ; i++){
prvky[i] = new Prvek(pole[i]); }
}
void vytvoreniSpojeMaticeObousmerna
(String spoj
) throws IOException { //vytvari matici sousednosti //System.out.println("vytvoreniSpojeMaticeObousmerna: "+spoj);
String [] casti
= spoj.
trim().
split(" "); if(casti.length>2){
}
for(int i = 0 ; i < prvky.length ; i++){
for(int j = 0 ; j < prvky.length ; j++){
if(prvky[i].nazev.equals(casti[0])&&prvky[j].nazev.equals(casti[1])){
matSousednosti[i][j]=1;
matSousednosti[j][i]=1;
return;
} }
} }
void vypisMatice() { //vypise matici sousednosti
System.
out.
println("Vypis matici:"); for(int i = 0 ; i < prvky.length ; i++){
for(int j = 0 ; j < prvky.length ; j++){
System.
out.
print(" "+matSousednosti
[i
][j
]); }
} }
void vypisMaticeorig() { //vypise matici sousednosti
System.
out.
println("Vypis matici orig:"); for(int i = 0 ; i < prvky.length ; i++){
for(int j = 0 ; j < prvky.length ; j++){
System.
out.
print(" "+matSousednostiOrig
[i
][j
]); }
} }
int[] sousedi(int vstup){ //slouzi pro for v ohodnoceni
// System.out.println("sousedi");
int array [] = null;
int pocitadlo = 0;
//System.out.println(matSousednosti[vstup].length);
for(int i = 0 ; i<matSousednosti[vstup].length ; i++){
//System.out.println("for");
//System.out.println(" "+matSousednosti[vstup][i]);
if(matSousednosti[vstup][i]== 1){
//System.out.println("true");
pocitadlo++;
} }
//System.out.println("pocitadlo "+pocitadlo);
int j = 0;
array = new int [pocitadlo];
for(int k = 0 ; k<matSousednosti[vstup].length ; k++){
if(matSousednosti[vstup][k]==1){
array[j] = k;
j++;
}
}
// System.out.println("vstup: "+vstup+", array "+Arrays.toString(array));
return array;
}
void prohledDoHloubky (int s){
pocetSubGrafu=1;
doHloubky(s);
for(int i = 0 ; i < prvky.length ; i++){
if(prvky[i].color == "White"){
doHloubky(i);
pocetSubGrafu++;
}
}
}
void doHloubky (int s) { //vytvori predchudce apod.
int v;
prvky[s].color = "Gray";
//prvky[s].vzdalenost = 0;
cas++;
prvky[s].objeven = cas;
int array [] = sousedi(s);
for (int i = 0 ; i < array.length ; i++) {
v = array[i];
if (prvky[v].color == "White") {
prvky[v].predchudce = s;
doHloubky(v);
} }
prvky[s].color = "Black";
prvky[s].dokoncen = cas = cas+1;
}
int index=0;
for(int i = 0 ; i< uzly.length ; i++){
if(uzly[i].equals(spoj)){
index = i;
break;
}
}
for(int i = 0 ; i < prvky.length ; i++){
for(int j = 0 ; j < prvky.length ; j++){
if(i==index || j==index){
matSousednosti[i][j]=0;
matSousednosti[j][i]=0;
} }
} }
void prebileni(){
for(int i = 0 ; i < prvky.length ; i++){
prvky[i].color = "White";
}
}
void origMatice(){
for(int i = 0 ; i < prvky.length ; i++){
for(int j = 0 ; j < prvky.length ; j++){
matSousednosti[i][j]=matSousednostiOrig[i][j];
matSousednosti[j][i]=matSousednostiOrig[j][i];
}
}
}
}