import
java.util.*;
public
class
MaxPathValue {
public
static
int
maxPathValue(
int
n,
int
m, List<List<Integer> > edges,
String values)
{
List<List<Integer> > adj =
new
ArrayList<>(n +
1
);
for
(
int
i =
0
; i <= n; i++) {
adj.add(
new
ArrayList<>());
}
List<Integer> inDegree =
new
ArrayList<>(
Collections.nCopies(n +
1
,
0
));
for
(List<Integer> edge : edges) {
adj.get(edge.get(
0
)).add(edge.get(
1
));
inDegree.set(edge.get(
1
),
inDegree.get(edge.get(
1
)) +
1
);
}
Queue<Integer> q =
new
LinkedList<>();
List<List<Integer> > dp =
new
ArrayList<>(n +
1
);
for
(
int
i =
0
; i <= n; i++) {
dp.add(
new
ArrayList<>(
Collections.nCopies(
26
,
0
)));
}
for
(
int
i =
1
; i <= n; i++) {
if
(inDegree.get(i) ==
0
) {
q.offer(i);
}
}
int
popCounts =
0
;
int
ans =
0
;
while
(!q.isEmpty()) {
int
curr = q.poll();
popCounts++;
dp.get(curr).set(
values.charAt(curr -
1
) -
'a'
,
dp.get(curr).get(values.charAt(curr -
1
)
-
'a'
)
+
1
);
ans = Math.max(
ans, dp.get(curr).get(
values.charAt(curr -
1
) -
'a'
));
for
(
int
i : adj.get(curr)) {
for
(
int
j =
0
; j <
26
; j++) {
dp.get(i).set(
j, Math.max(dp.get(i).get(j),
dp.get(curr).get(j)));
}
inDegree.set(i, inDegree.get(i) -
1
);
if
(inDegree.get(i) ==
0
) {
q.offer(i);
}
}
if
(popCounts == n) {
break
;
}
}
if
(!q.isEmpty() || popCounts < n) {
return
-
1
;
}
return
ans;
}
public
static
void
main(String[] args)
{
int
n =
5
;
int
m =
4
;
List<List<Integer> > edges = Arrays.asList(
Arrays.asList(
1
,
2
), Arrays.asList(
1
,
3
),
Arrays.asList(
3
,
4
), Arrays.asList(
4
,
5
));
String values =
"abaca"
;
int
result = maxPathValue(n, m, edges, values);
if
(result != -
1
) {
System.out.println(
"Maximum path value: "
+ result);
}
else
{
System.out.println(
"-1"
);
}
}
}