原题链接
题意:
思路:
- 51nod的强化版
- 由于题目中存在环,对于环上的字母来说,每个字母都会出现无穷次,所以答案为
,输出
- 如果不存在环,该图就是一个
,枚举每个字母,拓扑排序后用
求解这个字母出现的最多次数就好。
- 判环的话:如果
后仍有字母的入度
,说明有环。
代码:
const int maxn=3e5+100;
vector<int>g[maxn];
int n,m,dp[maxn][28],din[maxn];
char s[maxn];
int topsort(){
queue<int>q;
int siz=0;
rep(i,1,n)
if(din[i]==0){
q.push(i);
dp[i][s[i]-'a']=1;
siz++;
}
while(!q.empty()){
int t=q.front();q.pop();
for(auto v:g[t]){
rep(i,0,25){
int tt=0;
if(i==s[v]-'a') tt++;
dp[v][i]=max(dp[v][i],dp[t][i]+tt);
}
if(--din[v]==0) q.push(v),siz++;
}
}
rep(i,1,n)
if(din[i]>0) return -1;
int ans=0;
rep(i,1,n)
if(g[i].size()==0){
rep(j,0,25) ans=max(ans,dp[i][j]);
}
return ans;
}
int main(){
n=read,m=read;
scanf("%s",s+1);
rep(i,1,m){
int u=read,v=read;
din[v]++;
g[u].push_back(v);
}
cout<<topsort();
return 0;
}