zoukankan      html  css  js  c++  java
  • 7-12 How Long Does It Take (25分) 最短工期

    Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project.

    Input Specification:

    Each input file contains one test case. Each case starts with a line containing two positive integers N (≤), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N1), and M, the number of activities. Then Mlines follow, each gives the description of an activity. For the i-th activity, three non-negative numbers are given: S[i]E[i], and L[i], where S[i] is the index of the starting check point, E[i] of the ending check point, and L[i] the lasting time of the activity. The numbers in a line are separated by a space.

    Output Specification:

    For each test case, if the scheduling is possible, print in a line its earliest completion time; or simply output "Impossible".

    Sample Input 1:

    9 12
    0 1 6
    0 2 4
    0 3 5
    1 4 1
    2 4 1
    3 5 2
    5 4 0
    4 6 9
    4 7 7
    5 7 4
    6 8 2
    7 8 4
    
     

    Sample Output 1:

    18
    
     

    Sample Input 2:

    4 5
    0 1 1
    0 2 2
    2 1 3
    1 3 4
    3 2 5
    
     

    Sample Output 2:

    Impossible

    应该是关键路径的问题,用拓扑排序来解决。
    代码:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int n,m,ans;
    int mp[100][100];
    int l[100],q[100],t[100];
    int main() {
        int a,b,c,head = 0,tail = 0;
        scanf("%d%d",&n,&m);
        memset(mp,-1,sizeof(mp));
        for(int i = 0;i < m;i ++) {
            scanf("%d%d%d",&a,&b,&c);
            mp[a][b] = c;
            l[b] ++;
        }
        for(int i = 0;i < n;i ++) {
            if(!l[i]) {
                q[tail ++] = i;
            }
        }
        while(head < tail) {
            int temp = q[head ++];
            if(t[temp] > ans) ans = t[temp];
            for(int i = 0;i < n;i ++) {
                if(mp[temp][i] != -1) {
                    l[i] --;
                    if(!l[i]) q[tail ++] = i;
                    if(t[i] < t[temp] + mp[temp][i]) {
                        t[i] = t[temp] + mp[temp][i];
                    }
                }
            }
        }
        if(tail < n) printf("Impossible");
        else printf("%d",ans);
    }
  • 相关阅读:
    正方形_自适应_移动端
    meta name="viewport" content="width=device-width,initial-scale=1.0"
    :before/:after与::before/::after的区别 和属性content:值
    布局:flex弹性布局_兼容性写法
    布局:文本多列布局 column-* :
    布局:网格布局
    clear
    布局:盒模型 box-sizing : border-box ;
    object-fit : cover; 对象(图片和视频对象)
    布局:flex弹性布局_实践02
  • 原文地址:https://www.cnblogs.com/8023spz/p/12264617.html
Copyright © 2011-2022 走看看