SWJTU oj 2387 Magic Maze(DAG 求最长路)

来源:互联网 发布:你买过淘宝的福袋吗 编辑:程序博客网 时间:2024/06/14 08:33

这个题是给出一个有向无环图。

那么就考虑一个DP,dp[i]表示 i 结尾的路径最大值。

因为图是有向无环图,那么至少存在一个起点和终点。

对于起点 u 来说:dp[u]=0;

那么就倒着推,对于一个普通点 u ,可以又 u 的前驱点转移而来,一步步推到起点。

那么就记忆化搜索来写,很简单。

#include<stdio.h>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<vector>#include<stack>#include<math.h>#include<map>#include<set>#include<iostream>using namespace std;#define LL long long#define maxn 1005struct node{    int pre;    int len;};vector<node> v[maxn];int n,m;int dp[maxn];void inti(){    memset(dp,0,sizeof(dp));    for(int i=0;i<n;i++)        v[i].clear();}int dfs(int u){    if(dp[u]>0)        return dp[u];    int l=v[u].size();    int ans=0;    for(int i=0;i<l;i++)    {        node tmp=v[u][i];        int pre=tmp.pre;        int len=tmp.len;        ans=max(ans,dfs(pre)+len);    }    dp[u]=ans;    return ans;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        inti();        while(m--)        {            int u,vv,len;            scanf("%d%d%d",&u,&vv,&len);            node tmp;            tmp.pre=u;tmp.len=len;            v[vv].push_back(tmp);        }        for(int i=0;i<n;i++)        {            if(dp[i]>0)                continue;            dp[i]=dfs(i);        }        int ans=0;        for(int i=0;i<n;i++)            ans=max(ans,dp[i]);        printf("%d\n",ans);    }    return 0;}

原创粉丝点击