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);
    }
}
复制代码

 

posted @   悠悠呦~  阅读(260)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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】(字符串合并输出)
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示