poj1949Chores(建图或者dp)

简介:

/*
        题意:n个任务,有某些任务要在一些任务之前完成才能开始做!
                    第k个任务的约束只能是1...k-1个任务!问最终需要最少的时间完成全部的                     
                    任务!    
       思路:第i个任务要在第j个任务之前做,就在i,j之间建立一条有向边!
                   如果第i个任务之前没有任务,那么就是0和i建立一条有向边!
                   最后求一条0到所有节点距离的最大值!不一定是最后一个任务完成的
                   时间是最长的时间.......
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector> 
#include<queue>
#define N 10005 
using namespace std;

struct Edge{
    int v, w;
    Edge(){}
    
    Edge(int v, int w){
        this->v=v;
        this->w=w;
    }
}; 

queue<int>q;
vector<Edge>g[N];
int d[N];
int vis[N]; 
int maxT;
void spfa(){
    q.push(0);
    vis[0]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        int len=g[u].size();
        for(int i=0; i<len; ++i){
            int v=g[u][i].v, w=g[u][i].w;
            if(d[v]<d[u]+w){
                d[v]=d[u]+w;
                if(maxT<d[v]) maxT=d[v]; 
                if(!vis[v]){
                    q.push(v);
                    vis[v]=1;
                }
            }
        }
    }
}
int main(){
    int n;
    scanf("%d", &n);
    for(int i=1; i<=n; ++i){
            d[i]=vis[i]=0;
            int tt, m;
            scanf("%d%d", &tt, &m);
            if(m==0) g[0].push_back(Edge(i, tt));
            while(m--){
                int v;
                scanf("%d", &v);
                g[v].push_back(Edge(i, tt));
            } 
    }
    maxT=0;
    spfa();
    printf("%d\n", maxT); 
    return 0;
}


/*
          思路:其实是一个简单的dp题目!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 10005
using namespace std;
int dp[N];
int main(){
    
    int n, maxT=0;
    scanf("%d", &n);
    for(int i=1; i<=n; ++i){
        int w, m;
        scanf("%d%d", &w, &m);
        if(m==0) dp[i]=w;//不仅仅只有1节点没有约束节点
        
        while(m--){
            int v;
            scanf("%d", &v);
            dp[i]=max(dp[i], dp[v]+w);
        }
        if(maxT<dp[i]) maxT=dp[i];
    }
    printf("%d\n", maxT);
    return 0;
}

目录
相关文章
|
6月前
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
52 0
|
人工智能
动态规划(DP)——线性DP
动态规划(DP)——线性DP
|
机器学习/深度学习 定位技术
【每日一题Day109】LC1210穿过迷宫的最少移动次数 | BFS+dp
思路:使用BFS搜索,队列中存放三元组[蛇尾的横轴坐标x,蛇尾的纵轴坐标y,蛇的状态],当蛇为水平时,状态为0;当蛇为竖直时,状态为1
125 1
【每日一题Day109】LC1210穿过迷宫的最少移动次数 | BFS+dp
[LeeCode][动态规划][简单]上楼梯
[LeeCode][动态规划][简单]上楼梯
55 0
闫氏dp分析法(线性dp)AcWing 1015. 摘花生
闫氏dp分析法(线性dp)AcWing 1015. 摘花生
80 0
|
人工智能
洛谷P1115-最大子段和(DP-最大子段和)
洛谷P1115-最大子段和(DP-最大子段和)
洛谷P1115-最大子段和(DP-最大子段和)
AcWing288. 休息时间(环形DP)
AcWing288. 休息时间(环形DP)
101 0