You are given a graph with n nodes and m directed edges. One lowercase letter is assigned to each node. We define a path's value as the number of the most frequently occurring letter. For example, if letters on a path are "abaca", then the value of that path is 3. Your task is find a path whose value is the largest.
The first line contains two positive integers n, m (1 ≤ n, m ≤ 300 000), denoting that the graph has n nodes and m directed edges.
The second line contains a string s with only lowercase English letters. The i-th character is the letter assigned to the i-th node.
Then m lines follow. Each line contains two integers x, y (1 ≤ x, y ≤ n), describing a directed edge from x to y. Note that x can be equal to y and there can be multiple edges between x and y. Also the graph can be not connected.
Output a single line with a single integer denoting the largest value. If the value can be arbitrarily large, output -1 instead.
5 4 abaca 1 2 1 3 3 4 4 5
3
6 6 xzyabc 1 2 3 1 2 3 5 4 4 3 6 4
-1
10 14 xzyzyzyzqx 1 2 2 4 3 5 4 5 2 6 6 8 6 5 2 10 3 9 10 9 4 6 1 10 2 8 3 7
4
In the first sample, the path with largest value is 1 → 3 → 4 → 5. The value is 3 because the letter 'a' appears 3 times.
题意:
在n个顶点,m条边的有向图中,每个顶点用一个小写字母表示,求所有路径中权值的最大值;
何为路径的最大值呢????路径上字母出现的最大次数为路径的最大值;如果存在环,最大值为无限大,应该输出-1;
思路:
拓扑排序判断是否存在环
d [i][k] 代表 路径路过第i个结点中含有k字符的最大数目。
状态转移: d[j][k] = max( d[i][k] + ( node[j] == k) ) // k ∈ [0,26] i为j的上一个顶点
#include<bits/stdc++.h>
using namespace std;
const int N = 300005;
vector<int>G[N];
char str[N];
int in[N],dp[N][30];
int n,m;
void topuSort(){
queue<int>p;
for(int i=1;i<=n;i++){
if(!in[i]){//入度为0,加入队列
p.push(i);
dp[i][str[i]-'a']++;
}
}
int cnt=0;
while(!p.empty()){
int u=p.front();
p.pop();
cnt++;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
in[v]--;
if(!in[v]) p.push(v);
for(int j=0;j<26;j++)
dp[v][j]=max(dp[v][j],dp[u][j]+(str[v]-'a'==j));
}
}
if(cnt<n) printf("-1\n");
else{
int maxt=0;
for(int i=1;i<=n;i++)
for(int j=0;j<26;j++)
maxt=max(maxt,dp[i][j]);
printf("%d\n",maxt);
}
}
int main(){
scanf("%d%d",&n,&m);
scanf("%s",str+1);
for(int i=0;i<m;i++){
int a,b;
scanf("%d%d",&a,&b);
G[a].push_back(b);
in[b]++;
}
topuSort();
return 0;
}