• 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
    ", 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
    ", maxT);
    28     return 0;
    29 } 
  • 相关阅读:
    Delphi 连接 Paradox
    编译MangosZero
    关于StartCoroutine的简单线程使用
    cocos2dc-x解决中文乱码
    C++类构造函数初始化列表
    dynamic_cast
    cocos2d-x for android:SimpleGame分析
    C++宏定义详解
    四 AndEngine 画线
    三 最简单的 AndEngine 程序框架
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3958867.html
Copyright © 2020-2023  润新知