package amphis;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import graph.BFSPath;
import graph.DFSPath;
import graph.Graph;
class Page {
final int id;
final String title;
public Page(int id, String title) {
this.id = id;
this.title = title;
}
@Override
public int hashCode() {
return this.id;
}
@Override
public boolean equals(Object o) {
Page that = (Page)o;
return this.id == that.id;
}
@Override
public String toString() { return this.title; }
}
public class Amphi9 {
public static void main(String[] args) throws IOException {
Graph<Page> g = new Graph<Page>();
HashMap<Integer, Page> pages = new HashMap<Integer, Page>();
HashMap<String, Page> byName = new HashMap<String, Page>();
File f = new File("../../wikipedia/simple-pages.txt");
Scanner sc = new Scanner(f);
int count = 0;
while (sc.hasNext()) {
int id = sc.nextInt();
String s = sc.next();
Page p = new Page(id, s);
g.addVertex(p);
pages.put(id, p);
byName.put(s, p);
count++;
}
System.out.println(count + " pages");
sc.close();
f = new File("../../wikipedia/simple-links.txt");
BufferedReader r = new BufferedReader(new FileReader(f));
count = 0;
while (true) {
String s = r.readLine();
if (s == null) break;
sc = new Scanner(s);
Page p = pages.get(sc.nextInt());
if (p == null) continue;
while (sc.hasNext()) {
Page q = pages.get(sc.nextInt());
if (q == null) continue;
g.addEdge(p, q);
count++;
}
sc.close();
}
System.out.println(count + " links");
r = new BufferedReader(new InputStreamReader(System.in));
while (true) {
Page source = readPage(r, "enter source:", byName);
if (source == null) continue;
DFSPath<Page> dfs = new DFSPath<Page>(g);
dfs.dfsStack(source);
BFSPath<Page> bfs = new BFSPath<Page>(g);
bfs.bfs(source);
while (true) {
Page target = readPage(r, "enter target:", byName);
if (target == null) break;
if (dfs.isVisited(target)) {
System.out.println("DFS:");
List<Page> path = dfs.getPath(target);
printPath(source, path);
System.out.println("BFS:");
assert bfs.isVisited(target);
path = bfs.getPath(target);
printPath(source, path);
} else
System.out.println(" page '" + target + "' is not reachable");
}
}
}
static void printPath(Page source, List<Page> path) {
System.out.print(" " + source);
path.remove(0);
int i = 0;
for (Page p: path) {
System.out.print(" -> " + p); if (++i % 8 == 0) System.out.print("\n ");
}
System.out.println();
System.out.println(" path of length " + path.size());
}
static Page readPage(BufferedReader r, String msg, Map<String, Page> byName) throws IOException {
while (true) {
System.out.print(msg + " ");
String s = r.readLine();
if (s.equals("")) return null;
Page p = byName.get(s);
if (p != null) {
// System.out.println(" this is page " + p.id);
return p;
}
System.out.println(" unknown page");
}
}
}