View difference between Paste ID: igEi1TDc and adzyLe50
SHOW: | | - or go back to the newest paste.
1
import java.io.BufferedReader;
2
import java.io.InputStreamReader;
3
import java.util.ArrayList;
4
5
public class IzborPredmet {    
6
	public static void main(String[] args) throws Exception {
7
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8
		int brojNaPredmeti = Integer.parseInt(br.readLine());
9
		Graph g = new Graph(brojNaPredmeti);
10
		for(int i = 0; i < brojNaPredmeti; ++i) {
11
			String imeNaPredmet = br.readLine();
12
			g.addNode(imeNaPredmet, i);
13
		}
14
		int brojNaZavisniPredmeti = Integer.parseInt(br.readLine());
15
		for(int i = 0; i < brojNaZavisniPredmeti; ++i) {
16
			String predmeti = br.readLine();
17
			String predmet[] = predmeti.split(" ");
18
			for(int j = 1; j < predmet.length; ++j) {
19
				g.addEdge(predmet[0], predmet[j]);
20
			}
21
		}
22
		String poslednoSlushanPredmet = br.readLine();
23
		System.out.println(g.posledenPredmet(poslednoSlushanPredmet));
24
	}
25
}
26
27
class Graph {
28
	GraphNode[] jazol;
29
	
30
	public Graph(int brojNaJazli) {
31
		jazol = new GraphNode[brojNaJazli];
32
	}
33
	
34
	public void addNode(String imeNaPredmet, int index) {
35
		jazol[index] = new GraphNode(imeNaPredmet, index);
36
	}
37
	
38
	public void addEdge(String jazol1, String jazol2) {
39
		GraphNode prvJazol = null, vtorJazol = null;
40
		for(GraphNode gn: jazol) {
41
			if(gn.ime.equals(jazol1))
42
				prvJazol = gn;
43
			if(gn.ime.equals(jazol2))
44
				vtorJazol = gn;
45
		}
46
		prvJazol.addNeighbor(vtorJazol);
47
	}
48
	
49
	public String posledenPredmet(String poslednoSlushanPredmet) {
50
		GraphNode posledenPredmet = null;
51
		for(GraphNode gn: jazol)
52
			if(gn.ime.equals(poslednoSlushanPredmet))
53
				posledenPredmet = gn;
54
		boolean zavrsheni[] = new boolean[jazol.length];
55
		zavrsheniPredmeti(posledenPredmet, zavrsheni);
56
		for(GraphNode gn: jazol) {
57
			if(!zavrsheni[gn.index]&&gn.mozheDaSeSlusha(zavrsheni))
58
				return gn.toString();
59
		}
60
		return "";
61
	}
62
	
63
	private void zavrsheniPredmeti(GraphNode posledenPredmet, boolean []zavrsheni) {
64
		zavrsheni[posledenPredmet.index] = true;
65
		for(GraphNode gn: posledenPredmet.sosed) {
66
			zavrsheniPredmeti(gn, zavrsheni);
67
		}
68
	}
69
}
70
71
class GraphNode {
72
	String ime;
73
	int index;
74
	ArrayList<GraphNode> sosed;
75
	
76
	public GraphNode(String ime, int index) {
77
		this.ime = ime;
78
		this.index = index;
79
		sosed = new ArrayList<>();
80
	}
81
	
82
	public boolean containsNeighbor(GraphNode gn) {
83
		return sosed.contains(gn);
84
	}
85
	
86
	public void addNeighbor(GraphNode gn) {
87
		sosed.add(gn);
88
	}
89
	
90
	@Override
91
	public String toString() {
92
		return ime;
93
	}
94
	
95
	public boolean mozheDaSeSlusha(boolean[] zavrsheni) {
96
		for(GraphNode gn: sosed) {
97
			if(!zavrsheni[gn.index])
98
				return false;
99
		}
100
		return true;
101
	}
102
}