题目链接:http://poj.org/problem?id=3249

思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4000ms险过。

之后有写了个dfs记忆化搜索,果然快多了。

bfs AC code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 100100
#define MAXM 2002000
#define inf 1<<30 struct Edge{
int v,next;
}edge[MAXM]; int n,m,NE;
int head[MAXN]; void Insert(int u,int v)
{
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE++;
} int In_degree[MAXN],Out_degree[MAXN];
int dp[MAXN],value[MAXN];
bool mark[MAXN]; void bfs()
{
queue<int>que;
fill(dp,dp++n,-inf);
memset(mark,false,(n+)*sizeof(bool));
for(int i=;i<=n;i++)if(In_degree[i]==){
mark[i]=true;
dp[i]=value[i];
que.push(i);
}
while(!que.empty()){
int u=que.front();
que.pop();
mark[u]=false;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(dp[u]+value[v]>dp[v]){
dp[v]=dp[u]+value[v];
if(!mark[v]){
mark[v]=true;que.push(v);
}
}
}
}
} int main()
{
int u,v,ans;
while(~scanf("%d%d",&n,&m)){
NE=;
memset(head,-,(n+)*sizeof(int));
memset(In_degree,,(n+)*sizeof(int));
memset(Out_degree,,(n+)*sizeof(int));
for(int i=;i<=n;i++)scanf("%d",&value[i]);
while(m--){
scanf("%d%d",&u,&v);
Insert(v,u);
In_degree[u]++;
Out_degree[v]++;
}
bfs();
ans=-inf;
for(int i=;i<=n;i++){
if(Out_degree[i]==)ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return ;
}

dfs 记忆化 AC code:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 100100
#define MAXM 2002000
#define inf 1<<30 struct Edge{
int v,next;
}edge[MAXM]; int n,m,NE;
int head[MAXN]; void Insert(int u,int v)
{
edge[NE].v=v;
edge[NE].next=head[u];
head[u]=NE++;
} int In_degree[MAXN],Out_degree[MAXN];
int dp[MAXN],value[MAXN]; int dfs(int u)
{
if(dp[u]!=-inf)return dp[u];
dp[u]=value[u];
int ans=-inf;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
ans=max(ans,dfs(v));
}
if(ans!=-inf){
dp[u]+=ans;
}
return dp[u];
} int main()
{
int u,v,ans;
while(~scanf("%d%d",&n,&m)){
NE=;
memset(head,-,(n+)*sizeof(int));
memset(In_degree,,(n+)*sizeof(int));
memset(Out_degree,,(n+)*sizeof(int));
for(int i=;i<=n;i++)scanf("%d",&value[i]);
while(m--){
scanf("%d%d",&u,&v);
Insert(u,v);
In_degree[v]++;
Out_degree[u]++;
}
ans=-inf;
fill(dp,dp++n,-inf);
for(int i=;i<=n;i++){
if(In_degree[i]==){
ans=max(ans,dfs(i));
}
}
printf("%d\n",ans);
}
return ;
}

poj 3249(bfs+dp或者记忆化搜索)的更多相关文章

  1. 二进制数(dp,记忆化搜索)

    二进制数(dp,记忆化搜索) 给定k个<=1e6的正整数x(k不大于10),问最小的,能被x整除且只由01组成的数. 首先,dp很好写.用\(f[i][j]\)表示i位01串,模ki的值是j的数 ...

  2. poj1179 区间dp(记忆化搜索写法)有巨坑!

    http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...

  3. poj 1661 Help Jimmy(记忆化搜索)

    题目链接:http://poj.org/problem?id=1661 一道还可以的记忆化搜索题,主要是要想到如何设dp,记忆化搜索是避免递归过程中的重复求值,所以要得到dp必须知道如何递归 由于这是 ...

  4. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  5. 【bzoj1415】【聪聪和可可】期望dp(记忆化搜索)+最短路

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57148470 Descrition 首先很明显是 ...

  6. POJ 3252 Round Numbers(数位dp&amp;记忆化搜索)

    题目链接:[kuangbin带你飞]专题十五 数位DP E - Round Numbers 题意 给定区间.求转化为二进制后当中0比1多或相等的数字的个数. 思路 将数字转化为二进制进行数位dp,由于 ...

  7. noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)

    QWQ前几天才刚刚把这个D1T3写完 看着题解理解了很久,果然我还是太菜了QAQ 题目大意就是 给你一个n个点,m条边的图,保证1能到达n,求从1到n的 (设1到n的最短路长度是d)路径长度在[d,d ...

  8. poj 1085 Triangle War 博弈论+记忆化搜索

    思路:总共有18条边,9个三角形. 极大极小化搜索+剪枝比较慢,所以用记忆化搜索!! 用state存放当前的加边后的状态,并判断是否构成三角形,找出最优解. 代码如下: #include<ios ...

  9. poj 1088 动态规划+dfs(记忆化搜索)

    滑雪 Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Description Mi ...

随机推荐

  1. 算法笔记_073:哈密顿回路问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 什么是哈密顿回路? 引用自百度百科: 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图, ...

  2. 强大的vim配置文件,让编程更随意(转)

    欢迎来到小码哥的博客 博客搬家啦 blog.ma6174.com 强大的vim配置文件,让编程更随意 花了很长时间整理的,感觉用起来很方便,共享一下. 我的vim配置主要有以下优点: 1.按F5可以直 ...

  3. 【Statistics】CAP曲线

    功能描述 CAP曲线(Cumulative Accuracy Profile)/Power Curve(准确率/AR)是描述整个评级结果下,累计违约客户比例与累计客户比例的关系. 在完美的模型下,CA ...

  4. 05-spring-bean注入

    spring中只有两大核心技术: 控制反转(IOC)&依赖注入(DI),AOP(面向切面编程) 依赖注入:指利用配置文件的关系,来决定类之间的引用关系,以及数据的设置操作. 构造方法注入 默认 ...

  5. 小强升职记(GTD)脑图

  6. java的学习之路01

    [原创 - 尚学堂科技 - 马士兵老师] JAVA自学之路 一:学会选择 [转载请注明出处:http://www.bjsxt.com/zixue/zixuezhilu_1.html] 为了就业,不少同 ...

  7. atitit.流程标准化--- mysql启动不起来的排查流程attilax总结

    atitit.流程标准化--- mysql启动不起来的排查流程attilax总结 1. mysql的启动日志文件 1 2. console方式 1 3. 安装为服务 1 3.1. 使用默认配置文件 1 ...

  8. PMON

    PMON是一个兼有BIOS和boot loader部分功能的开放源码软件,多用于嵌入式系统. 与BIOS相比功能不足,与常见的bootloader 相比,功能要丰富的多.基于龙芯的系统采用 pmon ...

  9. SAP 经常使用T-CODE

    Plant Maintenance (PM) IW32 - Change Plant Maintenance Order  IW33 - Display Plant Maintenance Order ...

  10. html-loldemo

    百度版lol百科小样 <!DOCTYPE html> <html lang="en"> <head> <title>英雄联盟百科&l ...