poj1949Chores(建图或者dp)

 1 /*
 2         题意:n个任务,有某些任务要在一些任务之前完成才能开始做!
 3                     第k个任务的约束只能是1...k-1个任务!问最终需要最少的时间完成全部的
 4                     任务!
 5        思路:第i个任务要在第j个任务之前做,就在i,j之间建立一条有向边!
 6                    如果第i个任务之前没有任务,那么就是0和i建立一条有向边!
 7                    最后求一条0到所有节点距离的最大值!不一定是最后一个任务完成的
 8                    时间是最长的时间.......
 9 */
10 #include<iostream>
11 #include<cstring>
12 #include<cstdio>
13 #include<algorithm>
14 #include<vector>
15 #include<queue>
16 #define N 10005
17 using namespace std;
18
19 struct Edge{
20     int v, w;
21     Edge(){}
22
23     Edge(int v, int w){
24         this->v=v;
25         this->w=w;
26     }
27 };
28
29 queue<int>q;
30 vector<Edge>g[N];
31 int d[N];
32 int vis[N];
33 int maxT;
34 void spfa(){
35     q.push(0);
36     vis[0]=1;
37     while(!q.empty()){
38         int u=q.front();
39         q.pop();
40         vis[u]=0;
41         int len=g[u].size();
42         for(int i=0; i<len; ++i){
43             int v=g[u][i].v, w=g[u][i].w;
44             if(d[v]<d[u]+w){
45                 d[v]=d[u]+w;
46                 if(maxT<d[v]) maxT=d[v];
47                 if(!vis[v]){
48                     q.push(v);
49                     vis[v]=1;
50                 }
51             }
52         }
53     }
54 }
55 int main(){
56     int n;
57     scanf("%d", &n);
58     for(int i=1; i<=n; ++i){
59             d[i]=vis[i]=0;
60             int tt, m;
61             scanf("%d%d", &tt, &m);
62             if(m==0) g[0].push_back(Edge(i, tt));
63             while(m--){
64                 int v;
65                 scanf("%d", &v);
66                 g[v].push_back(Edge(i, tt));
67             }
68     }
69     maxT=0;
70     spfa();
71     printf("%d\n", maxT);
72     return 0;
73 }           
 1 /*
 2           思路:其实是一个简单的dp题目!
 3 */
 4 #include<iostream>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<algorithm>
 8 #define N 10005
 9 using namespace std;
10 int dp[N];
11 int main(){
12
13     int n, maxT=0;
14     scanf("%d", &n);
15     for(int i=1; i<=n; ++i){
16         int w, m;
17         scanf("%d%d", &w, &m);
18         if(m==0) dp[i]=w;//不仅仅只有1节点没有约束节点
19
20         while(m--){
21             int v;
22             scanf("%d", &v);
23             dp[i]=max(dp[i], dp[v]+w);
24         }
25         if(maxT<dp[i]) maxT=dp[i];
26     }
27     printf("%d\n", maxT);
28     return 0;
29 } 
时间: 2024-10-23 13:01:55

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

[SDOI2010] 所驼门王的宝藏 [建图+tarjan缩点+DAG dp]

题面传送门: 传送门 思路: 看完题建模,容易得出是求单向图最长路径的问题 那么把这张图缩强联通分量,再在DAG上面DP即可 然而 这道题的建图实际上才是真正的考点 如果对于每一个点都直接连边到它所有的后继节点,那么可以被卡掉(1e5个点在同一行上) 考虑改变思路,运用网络流建图中的一个常用技巧:把横边和竖边映射成点,再从每个点向所在横坐标.纵坐标代表的点连边即可 这样会有2e6+1e5个点,但是tarjan算法效率O(n),完全无压力 自由(和谐)门的话,目前还没有比较好的方法解决 上网看了一

一个神秘的oj2587 你猜是不是dp(线段树优化建图)

哇 这难道不是happiness的翻版题嘛? 从\(S\)向一个点连染成白色的收益 从这个点向\(T\)连染成黑色的收益 对于额外的收益,建一个辅助点,跟区间内的每个点连\(inf\),然后向S/T,连流量为收益 这不就结束了吗? 自信写完,提交 woc!!只有40分? #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath>

ZOJ 3644 Kitty&#39;s Game (图上DP 约数)

哎-这一场就做了三个题目,全队倒数第一,简直是太弱了. A Kitty's Game (ZOJ 3644) 题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3644 题意: 给出一个有向图,每个节点有一个权值pi, 有一个人从1节点出发(其权值为1节点的权值),前往n号节点,每经过一个节点,他的权值就变成了他经过这个节点前的权值和这个节点权值的最小公倍数,如果他经过这个节点后权值不发生变化则他就不能经过这个节点

poj2446Chessboard【矩阵建图+匈牙利】

大意: 已知有一个n*m的矩阵现在用1 * 2 的小木块去铺这个矩阵 ,矩阵中的黑点表示陷阱不可以铺,问能不能把除了陷阱之外的所有各自都铺满 nm<= 32 分析:第一印象是状压dp但是n太大, 后来网二分图方向考虑, 首先要构建一个二分图, 怎么构建呢, 我们可以从二分图的定义入手---分成两个部分,并且每个部分内部相互之间不能有边 对于一个矩阵有这么一个现象将每个点坐标的横纵坐标相加,那么和为奇数的点之间肯定不会相连 我们把和为奇数的作为白棋,把和为偶数的作为黑棋 那么用二分图或网络流都可以

【BZOJ-4289】Tax 最短路 + 技巧建图

4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Discuss] Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边权 N<=100000 M<=200000 Input Output Sample I

HDU3605: Escape-二进制优化建图-最大流

目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门 ?原题目描述在最下面. ?\(n(n\leq 100000)\)个人\(m(m\leq 10)\)个星球,每个星球容纳的人数有上限,每个人都有自己想去的星球意愿.问是否所有的都能去到外星球. 思路: ?肯定不能暴力建图,因为人太多了.注意到m的大小只有10.刷过状压dp的人应该都能想到要二进制优化. ?这是每个人其实都是没有区别的,有区别的只是他们的意愿.然后最多也只有\(2^{10} =1024\)

【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)

[题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖走型 八连通型 本质上只有两种类型(走一大串/走八连通),我们考虑这样一种建图方法: 对于每一行每一列建立一个点(点权为\(0\)) 对于关键点建立一个点(点权为\(1\)) 然后考虑这样一种建图方式,得到一个有点权无边权图 关键点所在的行与列无偿地向这个关键点连边 横走型的关键点向行连一条边,竖走

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给出火警位置所在的交叉路口 和 一个或多个消防站所处的交叉路口位置.输出要求按消防站到火警位置所需时间从小到大排列,输出信息包括消防站位置(初始位置),火警位置(目标位置),所需时间,最短路径上每个交叉路口. 题解:反向建图,从火警位置求一次最短路,求最短路时记录路径,按时间从小到大输出. 1 #in