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

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 ;
}

codeforce 460DIV2 D题的更多相关文章

  1. codeforce 461DIV2 F题

    题意 题目给出n,k,要求找出一个1到n的子集,(a,b)的对数等于k:(a,b)满足a<b且b%a==0: 分析 还记不记得求素数的时候的欧拉筛!对就那样!如果把每个数字看作一个点的话,可以通 ...

  2. codeforce 461DIV2 E题

    题意 有n棵树排成一排,每个树上都有c[i]只小鸟,只有站在树下才可以召唤小鸟,在i-th树下召唤k(k<=c[i])只小鸟需要消耗cost[i]*k的法力值,但是每召唤一只小鸟可以将法力值的上 ...

  3. codeforce 462DIV2 C题

    题意 给出一个只含有1和2的序列,有n个元素,可以选择一段区间进行翻转操作,求再反转后的最大非递减子序列的长度 分析 太菜了只想出了N^2的做法.序列只有1和2,那么每个非递减子序列都会有一个分界点, ...

  4. codeforce 459DIV2 C题

    题意 一串括号字符串,里面存在一些‘?’,其中‘?’既可以当作 '(' 又可以当作 ')' ,计算有多少对(l,r),在s中[sl,s(l+1),s(l+2),.....sr],内的括号是匹配的.n= ...

  5. Two progressions CodeForce 125D 思维题

    An arithmetic progression is such a non-empty sequence of numbers where the difference between any t ...

  6. codeforce 457DIV2 C题

    题意 你需要构造一个n个点m条边的无向有权图,要求这个图的MST中边权的和与从1到n的最短路长度都为素数 分析 可以想到这样一种贪心,在i到i+1直接连一条边,这样最短路和MST都会是同样的一些边.只 ...

  7. codeforce 457DIV2 B题

    题意:  题目给出两个整数n,k,(n<=10^18,k<=10^5),求一个含有k个整数的序列,要求以2为底,以序列内数字为幂的和为n,其中序列内最大的数最小,若有多个序列满足条件,输出 ...

  8. DSU on Tree浅谈

    DSU on tree 在之前的一次比赛中,学长向我们讲了了这样一个神奇的思想:DSU on tree(树上启发式合并),看上去就非常厉害--但实际上是非常暴力的一种做法;不过暴力只是看上去暴力,它在 ...

  9. ACDream手速赛2

    地址:http://acdream.info/onecontest/1014   都是来自Codeforce上简单题.   A. Boy or Girl 简单字符串处理   B. Walking in ...

随机推荐

  1. Re-install Flyme or Native Google Android on Meizu MX4 Ubuntu (by quqi99)

    作者:张华 发表于:2017-06-23 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 ( http://blog.csdn.net/quqi99 ) ## ...

  2. Markdown转HTML之Node篇

    前言 环境及编码 搭建环境 express markdown-it commander rd 核心编码 cmd_preview模块 cmd_build模块 打造命令行工具 写点xxmd 演示 总结 前 ...

  3. ZOJ-Big string(服气思维)

    个人心得:我在分治上看到的,但是感觉跟分治没关系,一眼想到斐波那契数可以找到此时n的字符串,但是无法精确到字母,题解的思路 真是令人佩服,以BA为基准,然后只要此时的长度大于7那么必然可以减去最大的斐 ...

  4. win键盘映射成mac键盘

    在win7系统下安装了mac虚拟机,mac的快捷键与win的键盘不一样,所以ctrl+c,ctrl+v都用不了,于是找方法映射. 搜索到 keyremap4macbook,,进到官网Karabiner ...

  5. MAC OS X常用命令总结

    附录:UNIX常用命令 ============================================================================ 1.  cd     ...

  6. acm中文版

    http://acm.nyist.net/JudgeOnline/problem.php?pid=1

  7. STM32从boot跳转到app失败

    现象:在每次boot执行完跳转到APP时,都会跑飞 原因:在boot中使用到了USART和TIM,boot执行完没有关闭总中断 方法:在boot执行完跳转之前关闭中断,__disable_irq() ...

  8. ubuntu下网卡eth1如何修改为eth0

    正常来说,Linux在识别网卡时第一张会是eth0,第二张才是eth1.有时候我们使用虚拟机克隆技术后网卡的信息就会改变,新克隆出来的虚拟主机网卡名字可能变为eth1.无论我们怎么修改都无法改变,这就 ...

  9. 使用内部变量,删除,替换,UNSET,等字符操作

    使用内部变量,删除,替换,UNSET,等字符操作 FREDDY=freddy   删除字符串前几2个字符: [root@localhost tmp]# echo ${FREDDY:2} eddy   ...

  10. USB设备驱动总结

    现象:把USB设备接到PC        (韦老师总结) 1. 右下角弹出"发现android phone" 2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有" ...