zoukankan      html  css  js  c++  java
  • CodeForces 721C Journey(拓扑排序+DP)

    <题目链接>

    题目大意:
    一个DAG图有n个点,m条边,走过每条边都会花费一定的时间,问你在不超过T时间的条件下,从1到n点最多能够经过几个节点。

    解题分析:
    对这个有向图,我们进行拓扑排序,并且在拓扑排序的过程中,用dp来进行状态的转移,$dp[i][j]$表示,在以$i$为终点的且经过$j$个点的路径中,所花的最少时间。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define pb push_back
    const int N = 5e3+5;
    int dp[N][N],path[N][N],indeg[N];
    bool vis[N];
    int n,m,T;
    
    struct Edge{ int to,val; };
    vector<Edge>G[N];
    
    inline void Toposort(){
        queue<int>q;
        memset(dp,0x3f,sizeof(dp));
        dp[1][1]=0;
        for(int i=1;i<=n;i++) if(!indeg[i]){
            vis[i]=true;q.push(i);
        }
        while(!q.empty()){
            int u=q.front();q.pop();
            vis[u]=true;
            for(int i=0;i<G[u].size();i++){
                int v=G[u][i].to,cost=G[u][i].val;
                if(indeg[v]){
                    --indeg[v];
                    for(int j=2;j<=n;j++){      //拓扑排序的过程中进行状态的转移
                        if(dp[v][j]>dp[u][j-1]+cost){
                            dp[v][j]=dp[u][j-1]+cost;
                            path[v][j]=u;      //记录转移到该状态的节点
                        }
                    }
                }
                if(!indeg[v])q.push(v);
            }
        }
    }
    void Output(int now,int num){      //输出路径
        if(now==1){ printf("%d",now);return; }
        Output(path[now][num],num-1);
        printf(" %d",now);
    }
    inline void Print(){
        int res=0;
        for(int i=n;i>=1;i--){
            if(dp[n][i]<=T){ res=i; break; }
        }printf("%d
    ",res);
        if(res)Output(n,res);
        puts("");
    }
    int main(){
        scanf("%d%d%d",&n,&m,&T);
        for(int i=1;i<=m;i++){
            int u,v,w;scanf("%d%d%d",&u,&v,&w);
            G[u].pb(Edge{v,w});
            indeg[v]++;
        }
        Toposort();
        Print();
    }
  • 相关阅读:
    linux中inittab文件详解
    Linux的 test 命令使用
    程序的链接和装入及Linux下动态链接的实现
    linux虚拟内存管理简要总结
    一些vim技巧和经验
    Linux cp mv rm ln 命令对于 inode 和 dentry 的影响
    Linux C编程一站式学习
    虚拟内存管理
    为何cp覆盖进程的动态库(so)会导致coredump
    linux下So覆盖导致coredump问题的分析
  • 原文地址:https://www.cnblogs.com/00isok/p/10606684.html
Copyright © 2011-2022 走看看