<题目链接>

题目大意:
有一个具有n个节点,m条边的有向图,每个点对应一个小写字母,现在给出每个顶点对应的字母以及有向边的连接情况,求经过的某一条路上相同字母出现的最多次数。如果次数无限大(出现环),则输出-1.

解题分析:

因为是有向图并且是对完整路径进行操作,所以我们能够想到拓扑排序,同时拓扑排序也能够比较方便地判环。现在就是考虑如何得到路径中出现次数最多的字母个数,我们对每个节点,维护一个dp[u][j],表示u节点在所有通过u的道路中,截止到u节点,j 字母所出现的最大个数(其实就是最基础的DP思想)。

 #include <bits/stdc++.h>
 using namespace std;

 #define N int(3e5+7)
 #define rep(i,s,t) for(int i=s;i<=t;i++)
 char str[N];
 int n,m,cnt;
 struct Edge{
     int to,nxt;
 }edge[N];
 int head[N],deg[N];
 queue<int>que;
 ];       //dp[i][j]表示在所有经过i点的道路中,截止到i点,路径中第j种字母最大的数量

 template<typename T>
 inline T read(T&x){
     x=;;char ch=getchar();
     ')f|=(ch=='-'),ch=getchar();
     +ch-',ch=getchar();
     return x=f?-x:x;
 }
 void init(){
     cnt=;
     memset(head,-,sizeof(head));
 }
 void addedge(int u,int v){
     edge[cnt].to=v,edge[cnt].nxt=head[u];
     head[u]=cnt++;
 }
 bool topo() {
     ;
     while(!que.empty()){
         num++;
         int u=que.front();que.pop();
         for(int i=head[u];~i;i=edge[i].nxt){
             int v=edge[i].to;
             deg[v]--;
             if(!deg[v])que.push(v);
             rep(i,,){         //将v节点所维护的26个字母的最大数量更新
                 if(i!=str[v]-'a'){
                     dp[v][i]=max(dp[v][i],dp[u][i]);   //v点能够对其str[v]的字母数量做出1的贡献,所以这里分情况讨论一下
                 });
             }//维护经过v点的所有路径中所有字母的最大数量
         }
     }
     if(num<n)return false;     //如果存在环,直接输出NO
     return true;
 }
 int main(){
     read(n);read(m);
     init();
     scanf();
     rep(i,,m){
         int u,v;read(u);read(v);
         addedge(u,v);
         deg[v]++;     //记录每个点的入度
     }
     rep(i,,n) if(!deg[i]){
             que.push(i);         //将入度为0的加入队列
             dp[i][str[i]-'a']++; //初始化每个0入度点,刚开始维护的字母种类对应的数量
     }
     if(!topo())puts("-1");
     else {
         ;
         rep(i,,n) rep(j,,){
             ans=max(ans,dp[i][j]);
         }
         printf("%d\n",ans);
     }
 }

2019-02-16

Codeforces 919D Substring 【拓扑排序】+【DP】的更多相关文章

  1. CodeForces - 919D Substring (拓扑排序+dp)

    题意:将一个字符串上的n个字符视作点,给出m条有向边,求图中路径上最长出现的相同字母数. 分析:首先如果这张图中有环,则可以取无限大的字符数,在求拓扑排序的同时可以确定是否存在环. 之后在拓扑排序的结 ...

  2. Codeforces 919D Substring (拓扑排序+树形dp)

    题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...

  3. Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )

    题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是  a ...

  4. CodeForces 721C Journey(拓扑排序+DP)

    <题目链接> 题目大意:一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点. 解题分析:对这个有向图,我们进行拓扑排序, ...

  5. POJ 3249 拓扑排序+DP

    貌似是道水题.TLE了几次.把所有的输入输出改成scanf 和 printf ,有吧队列改成了数组模拟.然后就AC 了.2333333.... Description: MR.DOG 在找工作的过程中 ...

  6. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  7. 洛谷P3244 落忆枫音 [HNOI2015] 拓扑排序+dp

    正解:拓扑排序+dp 解题报告: 传送门 我好暴躁昂,,,怎么感觉HNOI每年总有那么几道题题面巨长啊,,,语文不好真是太心痛辣QAQ 所以还是要简述一下题意,,,就是说,本来是有一个DAG,然后后来 ...

  8. 【BZOJ-1194】潘多拉的盒子 拓扑排序 + DP

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 456  Solved: 215[Submit][Stat ...

  9. 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP

    [BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...

  10. bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)

    Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...

随机推荐

  1. swift 实践- 10 -- UIProgressView

    import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoa ...

  2. Java、Apache Tomcat下载与安装及环境变量配置

    1.Java JDK 与 Apache Tomcat 下载 JDK 下载 Apache Tomcat 下载 2.安装与环境变量配置 关于 JDK 的安装挺简单的,网上教程也挺多,Tomcat 下载免安 ...

  3. Web框架之Bootstrap

    一.Bootstrap简介 Bootstrap,来自Twitter的设计师Mark Otto和Jacob Thornton合作开发,是目前很受欢迎的Web前端开源框架. Bootstrap 是基于HT ...

  4. Confluence 6 管理员联系表单的后台配置界面

    管理员联系表单的后台配置界面截图和配置. 对输入的数据进行编辑和选择是否启用发送电子邮件给管理员 https://www.cwiki.us/display/CONFLUENCEWIKI/Configu ...

  5. (一)STL体系结构基础介绍

    一.STL六大部件 容器(Containers):存放元素,内存由分配器搞定 分配器(Allocator):支持容器的内存分配 算法:操作容器元素的函数.与OO不同(面向对象将元素与函数放到一个类里) ...

  6. flutter No material widget found textfield widgets require a material widget ancestor

    Error states that TextField widgets require a Material widget ancestor. Simply wrapping your whole l ...

  7. 9.jexus 配置ssl

    这里非常感谢宇内流云,这是他的博客http://www.cnblogs.com/yunei/. 1,运行环境 CentOS7 jexus5.8.2.9(独立版) jexus 的下载地址 https:/ ...

  8. SSM框架整合篇

    目录 SSM整合 框架搭建步骤 SSM整合 Author:SimpleWu github(已上传SSMrest风格简单增删该查实例):https://gitlab.com/450255266/code ...

  9. 使用Spring配置数据源JdbcTemplate

    c3p0作为演示 1.编写资源文件(db.properties) jdbc.user=root jdbc.password=root jdbc.jdbcUrl=jdbc:mysql://localho ...

  10. PHP array_combine()

    // 需要替换 key 的数组 $arr_old = array( '0' => array('id' => 1, 'name' => 'Carroll'), '1' => a ...