fork download
  1.  
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.PrintStream;
  6. //import java.util.Scanner;
  7.  
  8. import java.util.Arrays;
  9.  
  10.  
  11. //City map #1: 1 camera(s) found
  12.  
  13. public class Main {
  14.  
  15. //private static Scanner sc = new Scanner(System.in);
  16. private static BufferedReader bfr;
  17. private static PrintStream bwr;
  18. static int pocetSpoju =1;
  19. static DfsMatice base;
  20. static int pocetSub;
  21. static String vystup = "";
  22. static int pocitadloMest=0;
  23. static int pocitadloKrizovatek=0;
  24. static String localVystup="";
  25.  
  26. static void zpracovani(int pocetMest) throws IOException {
  27. pocitadloMest++;
  28. pocitadloKrizovatek=0;
  29. localVystup="";
  30. String vstup = new String();
  31. for(int i = 0 ; i < pocetMest ; i++){
  32. vstup = vstup + bfr.readLine().trim()+" ";
  33. }
  34. //vstup = vstup + bfr.readLine().trim();
  35. // System.out.println(vstup.trim());
  36. String [] poleVstupu = vstup.trim().split(" ");
  37. Arrays.sort(poleVstupu);
  38. base.vytvoreniUzlu(poleVstupu);
  39. pocetSpoju = Integer.valueOf(bfr.readLine().trim());
  40. // System.out.println("pocetSpoju"+pocetSpoju);
  41. //bfr.readLine();
  42. for(int i = 0 ; i<pocetSpoju ; i++){
  43. base.vytvoreniSpojeMaticeObousmerna(bfr.readLine().trim());
  44. }
  45. base.vytvoreniOrigMtice();
  46. // base.vypisMaticeorig();
  47. //base.vypisMatice();
  48. base.prohledDoHloubky(0);
  49. pocetSub =base.pocetSubGrafu;
  50. //System.out.println(pocetSub);
  51. base.prebileni();
  52. for(int i = 0 ; i<poleVstupu.length ; i++){
  53. vyhodnoceni(poleVstupu[i]);
  54. }
  55. vystup = vystup+"City map #"+pocitadloMest+": "+pocitadloKrizovatek+" camera(s) found"+"\n"+localVystup+"\n";
  56. }
  57. static void vyhodnoceni(String vyhod) {
  58. base.odeberSpoj(vyhod);
  59. base.prohledDoHloubky(0);
  60. //base.vypisMatice();
  61. //base.vypisMaticeorig();
  62. ////System.out.println(base.pocetSubGrafu);
  63. // System.out.println("base.pocetSubGrafu "+base.pocetSubGrafu+" "+"pocetSub "+pocetSub);
  64. if(base.pocetSubGrafu>(pocetSub+1)){
  65. localVystup = localVystup+vyhod+"\n";
  66. pocitadloKrizovatek++;
  67. }
  68. base.prebileni();
  69. base.origMatice();
  70. }
  71. public static void main(String[] args) throws NumberFormatException, IOException {
  72. bwr = new PrintStream(System.out);
  73. bwr.print("line1\n");
  74. base = new DfsMatice();
  75. int pocet = 0;
  76. while(true){
  77. pocet = Integer.valueOf(bfr.readLine().trim());
  78. //System.out.println("pocet"+pocet);
  79. if(pocet!=0){
  80. zpracovani(pocet); }
  81. else{
  82. break; } }
  83.  
  84. // System.out.print(vystup.trim());
  85. //System.out.print("\n"+vystup.trim());
  86. bwr.print("\n"+vystup.trim());
  87. }
  88. }
  89. class Prvek {
  90. public String nazev;
  91. public Hrana hrana;
  92. //Prvek top;
  93. public String color;
  94. public int vzdalenost;
  95. public int predchudce;
  96. public int objeven;
  97. public int dokoncen;
  98. Prvek(String nazev) {
  99. this.nazev = nazev;
  100. this.hrana = null;
  101. this.color = "White";
  102. this.vzdalenost = Integer.MAX_VALUE;
  103. this.predchudce = -1;
  104. this.objeven = Integer.MAX_VALUE;
  105. this.dokoncen = Integer.MAX_VALUE;
  106. }
  107.  
  108. }
  109. class Hrana {
  110. public int vrchol;
  111. public Hrana dalsi;
  112.  
  113. public Hrana (int vrchol) {
  114. this.vrchol = vrchol;
  115. dalsi = null;
  116. } }
  117.  
  118.  
  119.  
  120.  
  121. class DfsMatice {
  122. private static String[] uzly;
  123. private static int matSousednosti [][]; //matice souslednosti
  124. private static int matSousednostiOrig [][];
  125. public Prvek [] prvky; //pole objektu
  126. public Prvek [] vystupni;
  127. // private Prvek prac;
  128. private static int cas = 0;
  129. int pocetSubGrafu;
  130.  
  131.  
  132. DfsMatice() {
  133. this.prvky=null;
  134. this.pocetSubGrafu=1;
  135. }
  136. void vytvoreniOrigMtice(){
  137. matSousednostiOrig = new int [uzly.length][uzly.length];
  138. for(int i = 0 ; i < prvky.length ; i++){
  139. for(int j = 0 ; j < prvky.length ; j++){
  140. matSousednostiOrig[i][j]=matSousednosti[i][j];
  141. matSousednostiOrig[j][i]=matSousednosti[j][i];
  142. }
  143. }
  144. }
  145.  
  146. void vytvoreniUzlu(String[] pole){
  147. uzly = pole;
  148. matSousednosti = new int [uzly.length][uzly.length];
  149. prvky = new Prvek [pole.length];
  150. for(int i = 0 ; i < pole.length ; i++){
  151. prvky[i] = new Prvek(pole[i]); }
  152. Arrays.toString(pole);
  153. }
  154. void vytvoreniSpojeMaticeObousmerna(String spoj) throws IOException { //vytvari matici sousednosti
  155. //System.out.println("vytvoreniSpojeMaticeObousmerna: "+spoj);
  156. String [] casti = spoj.trim().split(" ");
  157. if(casti.length>2){
  158. throw new IOException();
  159. }
  160. for(int i = 0 ; i < prvky.length ; i++){
  161. for(int j = 0 ; j < prvky.length ; j++){
  162. if(prvky[i].nazev.equals(casti[0])&&prvky[j].nazev.equals(casti[1])){
  163. matSousednosti[i][j]=1;
  164. matSousednosti[j][i]=1;
  165. return;
  166. } }
  167. } }
  168.  
  169. void vypisMatice() { //vypise matici sousednosti
  170. System.out.println("");
  171. System.out.println("Vypis matici:");
  172. for(int i = 0 ; i < prvky.length ; i++){
  173. for(int j = 0 ; j < prvky.length ; j++){
  174. System.out.print(" "+matSousednosti[i][j]);
  175. }
  176. System.out.println("");
  177. } }
  178.  
  179. void vypisMaticeorig() { //vypise matici sousednosti
  180. System.out.println("");
  181. System.out.println("Vypis matici orig:");
  182. for(int i = 0 ; i < prvky.length ; i++){
  183. for(int j = 0 ; j < prvky.length ; j++){
  184. System.out.print(" "+matSousednostiOrig[i][j]);
  185. }
  186. System.out.println("");
  187. } }
  188.  
  189. int[] sousedi(int vstup){ //slouzi pro for v ohodnoceni
  190. // System.out.println("sousedi");
  191. int array [] = null;
  192. int pocitadlo = 0;
  193. //System.out.println(matSousednosti[vstup].length);
  194. for(int i = 0 ; i<matSousednosti[vstup].length ; i++){
  195. //System.out.println("for");
  196. //System.out.println(" "+matSousednosti[vstup][i]);
  197. if(matSousednosti[vstup][i]== 1){
  198. //System.out.println("true");
  199. pocitadlo++;
  200. } }
  201. //System.out.println("pocitadlo "+pocitadlo);
  202. int j = 0;
  203. array = new int [pocitadlo];
  204. for(int k = 0 ; k<matSousednosti[vstup].length ; k++){
  205. if(matSousednosti[vstup][k]==1){
  206. array[j] = k;
  207. j++;
  208. }
  209. }
  210. // System.out.println("vstup: "+vstup+", array "+Arrays.toString(array));
  211. return array;
  212. }
  213.  
  214. void prohledDoHloubky (int s){
  215. pocetSubGrafu=1;
  216. doHloubky(s);
  217.  
  218. for(int i = 0 ; i < prvky.length ; i++){
  219. if(prvky[i].color == "White"){
  220. doHloubky(i);
  221. pocetSubGrafu++;
  222. }
  223. }
  224. }
  225.  
  226.  
  227. void doHloubky (int s) { //vytvori predchudce apod.
  228. int v;
  229. prvky[s].color = "Gray";
  230. //prvky[s].vzdalenost = 0;
  231. cas++;
  232. prvky[s].objeven = cas;
  233. int array [] = sousedi(s);
  234. for (int i = 0 ; i < array.length ; i++) {
  235. v = array[i];
  236. if (prvky[v].color == "White") {
  237. prvky[v].predchudce = s;
  238. doHloubky(v);
  239. } }
  240. prvky[s].color = "Black";
  241. prvky[s].dokoncen = cas = cas+1;
  242.  
  243. }
  244. void odeberSpoj(String spoj){
  245. int index=0;
  246. for(int i = 0 ; i< uzly.length ; i++){
  247. if(uzly[i].equals(spoj)){
  248. index = i;
  249. break;
  250. }
  251. }
  252. for(int i = 0 ; i < prvky.length ; i++){
  253. for(int j = 0 ; j < prvky.length ; j++){
  254. if(i==index || j==index){
  255. matSousednosti[i][j]=0;
  256. matSousednosti[j][i]=0;
  257.  
  258. } }
  259. } }
  260. void prebileni(){
  261. for(int i = 0 ; i < prvky.length ; i++){
  262. prvky[i].color = "White";
  263. }
  264. }
  265. void origMatice(){
  266.  
  267. for(int i = 0 ; i < prvky.length ; i++){
  268. for(int j = 0 ; j < prvky.length ; j++){
  269. matSousednosti[i][j]=matSousednostiOrig[i][j];
  270. matSousednosti[j][i]=matSousednostiOrig[j][i];
  271. }
  272. }
  273. }
  274. }
Success #stdin #stdout 0.08s 380160KB
stdin
6
sugarloaf
maracana
copacabana
ipanema
corcovado
lapa
7
ipanema copacabana
copacabana sugarloaf
ipanema sugarloaf
maracana lapa
sugarloaf maracana
corcovado sugarloaf
lapa corcovado
5
guanabarabay
downtown
botanicgarden
colombo
sambodromo
4
guanabarabay sambodromo
downtown sambodromo
sambodromo botanicgarden
colombo sambodromo
0
stdout
line1

City map #1: 1 camera(s) found
sugarloaf

City map #2: 1 camera(s) found
sambodromo