感觉这个题不错,对拓扑排序有了更深的了解,用两种拓扑排序都写了些试试。

dfs

 #include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=+;
char s[maxn];
vector<int>G[maxn];
int n,m;
int f[maxn][];
int vis[maxn];
int in[maxn];
bool dfs(int u){
vis[u]=-;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(vis[v]==-)return false;
if(!vis[v]&&!dfs(v))return false;
for(int i=;i<;i++){
f[u][i]=max(f[u][i],f[v][i]);
}
}
f[u][s[u]-'a']++;
vis[u]=;
return true;
}
bool topo(){
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)if(!vis[i]){
if(!dfs(i))return false;
}
return true;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
memset(in,,sizeof(in));
memset(f,,sizeof(f));
scanf("%s",s+);
for(int i=;i<=n;i++)G[i].clear();
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
G[a].push_back(b);
if(a==b){
cout<<"-1"<<endl;
return ;
}
}
if(!topo()){
cout<<"-1"<<endl;
continue;
}
int ans=;
for(int i=;i<=n;i++){
for(int j=;j<;j++){
ans=max(ans,f[i][j]);
}
}
cout<<ans<<endl;
}
return ;
}

bfs

 #include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn=+;
vector<int>G[maxn];
queue<int>q;
char s[maxn];
int n,m;
int in[maxn],f[maxn][];
int main(){
scanf("%d%d",&n,&m);
memset(f,,sizeof(f));
memset(in,,sizeof(in));
scanf("%s",s+);
int a,b;
for(int i=;i<=m;i++){
scanf("%d%d",&a,&b);
G[a].push_back(b);
in[b]++;
}
for(int i=;i<=n;i++){
if(!in[i])q.push(i);
f[i][s[i]-'a']=;
}
while(!q.empty()){
int u=q.front();q.pop();
for(int i=;i<G[u].size();i++){
int v=G[u][i];
in[v]--;
if(!in[v])q.push(v);
for(int l=;l<;l++){
f[v][l]=max(f[v][l],f[u][l]+(s[v]==l+'a'));
}
}
}
for(int i=;i<=n;i++)if(in[i]){
cout<<"-1";
return ;
}
int ans=;
for(int i=;i<=n;i++){
for(int j=;j<;j++){
ans=max(ans,f[i][j]);
}
}
cout<<ans;
return ;
}

最新文章

  1. Android-组件RadioButton使用技巧
  2. [BZOJ 3143][HNOI2013]游走(数学期望)
  3. java 验证身份证号
  4. 【zoj2562】反素数
  5. qt创建android项目后需要加入的参数
  6. android离线安装adt
  7. hdu5046(重复覆盖+二分)
  8. Java 新特性(2) - JDK6 新特性
  9. 写给自己的web总结——css篇(1)
  10. 【测试】Gunicorn , uWSGI同步异步测试以及应用场景总结
  11. 第35节:Java面向对象中的多线程
  12. Go语言排序算法实现
  13. php 按照中文字母名字排序,并把相应的头像显示出来
  14. AttributeError: module &#39;DBBase&#39; has no attribute &#39;DBBase&#39;
  15. JavaScript 练习题
  16. Java实现FTP批量大文件上传下载篇1
  17. Python2.7-fractions
  18. css实现表格的td里面的内容居中.
  19. webpack使用来打包前端代码
  20. 如何用C#做一个悬浮窗口程序

热门文章

  1. 基于Photon 的 PUN+ 如何自动实现RPC呼叫的.
  2. linux常用开发工具命令行
  3. 【解题报告】2014ACM/ICPC上海赛区现场赛B
  4. 1138. Postorder Traversal (25)
  5. CSS命名规范参考及书写注意事项
  6. DispatcherServlet的处理流程
  7. ansible安装基本使用
  8. Log4net系列一:Log4net搭建之文本格式输出【转】
  9. Python函数-repr()
  10. iframe添加点击事件