POJ 3249 Test for Job (拓扑排序+DP)
<题目链接>
题目大意:
给定一个有向图(图不一定连通),每个点都有点权(可能为负),让你求出从源点走向汇点的路径上的最大点权和。
解题分析:
想到拓扑排序就好做了,然后在拓扑的过程中进行简单的状态转移。
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <iostream> using namespace std; #define REP(i,s,t) for(int i=s;i<=t;i++) #define clr(a,b) memset(a,b,sizeof(a)) template<typename T> inline void read(T&x){ x=0;int f=1;char ch=getchar(); while(ch<'0' ||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } x*=f; } typedef long long ll; const int N = 1e5+5, M = 1e6+5; int w[N],in[N],out[N],head[N]; int n,m,cnt; ll dp[N]; struct Edge{ int to,nxt; }e[M]; inline void init(){ cnt=0; clr(head,-1);clr(dp,-0x3f); clr(in,0);clr(out,0); } inline void add(int u,int v){ e[cnt]=(Edge){ v,head[u] };head[u]=cnt++; } inline void TopoSort(){ queue<int>q; REP(i,1,n) if(!in[i]){ q.push(i); dp[i]=w[i]; } while(!q.empty()){ int u=q.front();q.pop(); for(int i=head[u];~i;i=e[i].nxt){ int v=e[i].to; if(in[v]==0)continue; in[v]--; dp[v]=max(dp[v],dp[u]+w[v]); //就这里进行简单的状态转移 if(!in[v])q.push(v); } } } int main(){ while(~scanf("%d%d",&n,&m)){ init(); REP(i,1,n)read(w[i]); REP(i,1,m){ int u,v;read(u);read(v); add(u,v); out[u]++;in[v]++; } TopoSort(); ll mx=-1e18; REP(i,1,n) if(!out[i]){ mx=max(mx,dp[i]); } printf("%lld\n",mx); } }
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2018-05-19 HDU 1503【LCS】(字符串合并输出)