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;
}
时间: 2024-10-04 01:13:09

poj1949Chores(建图或者dp)的相关文章

初识视觉SLAM:用相机解决定位和建图问题

引言:视觉SLAM 是指用相机解决定位和建图问题.本文以一个小机器人为例形象地介绍了视觉SLAM的功能及特点. 本文选自<视觉SLAM十四讲:从理论到实践>. SLAM 是Simultaneous Localization and Mapping 的缩写,中文译作"同时定位与地图构建".它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动.如果这里的传感器主要为相机,那就称为"视觉SLAM". 假设我们组

POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)

/* bfs搜索!要注意的是点与点的权值是不一样的哦! 空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去) 所以用到优先队列进行对当前节点步数的更新! */ #include<iostream> #include<queue> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int n, m; char map[305][305];

poj 2226 Muddy Fields(合理建图+二分匹配)

/* 题意:用木板盖住泥泞的地方,不能盖住草.木板任意长!可以重叠覆盖! '*'表示泥泞的地方,'.'表示草! 思路: 首先让我们回忆一下HDU 2119 Matrix这一道题,一个矩阵中只有0, 1,然后让我们通过选择一行,或者 是一列将其所在行的或者所在列的 1全部删掉,求出最少需要几步? 这道题的思路就是:将行标 和 列标值为1的建立一条边!通过匈牙利算法可以得到这个二分图的最大匹配数 最大匹配数==最小顶点覆盖数!最小顶点覆盖就是用最少的点覆盖了这个二分图的所有的边,然后去掉这些 最小覆

UVa 437 The Tower of Babylon:DP&amp;amp;DAG

437 - The Tower of Babylon Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=378 思路: 对于一个(x,y,z)砖头,它可以有3中姿势放置: (前两个为地面,后一个为高) x, y, z x, z, y y, z, x 把每种姿势

韩红再访四川地震灾区出席小学开学典礼(图)

新浪娱乐讯 2010年9月20日,四川省德阳什邡市龙居中心小学重建后第一次开学仪式.这所在2008年汶川地震中损毁的小学,历时两年完成重建.与中国扶贫基金会一起捐助了校舍重建的藏族歌唱家.军人韩红,作为荣誉校长与孩子们一起参加开学典礼.迎来新学期. 2008年5月12日,汶川地震发生,位于四川省德阳什邡市的龙居中心小学校舍轰然倒塌.全校700余师生中,69人遇难.赈灾发生第一时间,韩红与中国扶贫基金会合作的公益品牌"韩红爱心行动",迅速募集善款及救灾物资,赶赴灾区,进行紧急救援. 正是

uva 10599

题意 给一个n*m大小的网格,有一些格子上面会有一个垃圾.机器人从左上角(1,1)出发,每次只能选 择向右,或者向下走一步, 终点是(n, m).问最多可以捡多少个垃圾? 且捡最多垃圾有几种路径方案? 注意路径方案指和有垃圾的格子有关. 思路 一开始没注意到方案只和有垃圾的格子有关,当作水 题做,结果输出的方案数比样例大了非常多.然后又想了下. 根据题意,路径只和有垃圾的格子有关,那 么我们可以把这个网格抽象成一个图,图的节点就是有垃圾的格子,然后加上 一些边把这些格子连起来. 那么关键就是怎样

poj3422 Kaka&#039;s Matrix Travels(最小费用最大流问题)

/* poj3422 Kaka's Matrix Travels 不知道 k次 dp做为什么不对??? 看了大牛的代码,才知道还可以这样做! 开始没有理解将a 和 a' 之间建立怎样的两条边,导致程序一直陷入死循环,真心花了好长时间,快崩溃了.无语..... 题意:有个方阵,每个格子里都有一个非负数,从左上角走到右下角,每次走一步,只能往右或往下走,经过的数字拿走 每次都找可以拿到数字和最大的路径走,走k次,求最大和 这是 最大费用最大流 问题 每次spfa都找的是一条和最大的路径 s--到左上

poj3249Test for Job(记忆化搜索)

/* 题意:给一个DAG图,n个节点,每个节点都对应一个值,入度为零的点走到出度为零的点,计算所有可能路径 经过节点值的和最大! 思路:记忆话搜索:也就是如果我们搜索到某一个节点的时候发现该节点已经存在了值,那么直接返回该节点的值! 和回溯的思想差不多吧! 注意:我们是正向建图,并且记忆话搜索是先将子节点的最优值计算出来,然后在计算父节点的最优值 所以最终的最优值的结果在 入度为0的节点上! */ #include<iostream> #include<cstdio> #inclu

彻底弄懂最短路径问题

        只想说:温故而知新,可以为师矣.我大二的<数据结构>是由申老师讲的,那时候不怎么明白,估计太理论化了(ps:或许是因为我睡觉了):今天把老王的2011年课件又看了一遍,给大二的孩子们又讲了一遍,随手谷歌了N多资料,算是彻底搞懂了最短路径问题.请读者尽情享用--         我坚信:没有不好的学生,只有垃圾的教育.不过没有人理所当然的对你好,所以要学会感恩. 一.问题引入         问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径--