zoukankan      html  css  js  c++  java
  • pat06-图7. How Long Does It Take (25)

    06-图7. How Long Does It Take (25)

    时间限制
    200 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    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 (<=100), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N-1), and M, the number of activities. Then M lines 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
    

    提交代码

    AOV图。拓扑排序。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<queue>
     6 #include<vector>
     7 #include<cmath>
     8 #include<string>
     9 using namespace std;
    10 int Map[105][105],dist[105],indegree[105];
    11 int main(){
    12     //freopen("D:\INPUT.txt","r",stdin);
    13     int n,m;
    14     int i,j,a,b,cost;
    15     scanf("%d %d",&n,&m);
    16     for(i=0;i<n;i++){
    17         dist[i]=-1;
    18         indegree[i]=0;
    19         for(j=0;j<n;j++){
    20             Map[i][j]=Map[j][i]=-1;
    21         }
    22     }
    23     for(i=0;i<m;i++){
    24         scanf("%d %d %d",&a,&b,&cost);
    25         Map[a][b]=cost;
    26         indegree[b]++;
    27     }
    28     queue<int> q;
    29     for(i=0;i<n;i++){
    30         if(!indegree[i]){
    31             q.push(i);
    32             dist[i]=0;//这个初始化很重要
    33         }
    34     }
    35     int cur;
    36     while(!q.empty()){
    37         cur=q.front();
    38         q.pop();
    39         for(i=0;i<n;i++){
    40             if(Map[cur][i]!=-1){
    41                indegree[i]--;
    42                if(dist[cur]+Map[cur][i]>dist[i]){
    43                     dist[i]=dist[cur]+Map[cur][i];
    44                 }
    45                if(!indegree[i]){
    46                     q.push(i);
    47                }
    48             }
    49         }
    50     }
    51     int maxcost=-1;
    52     for(i=0;i<n;i++){
    53         if(indegree[i]){
    54             break;
    55         }
    56         if(dist[i]>maxcost){
    57             maxcost=dist[i];
    58         }
    59     }
    60     if(i==n){
    61         printf("%d
    ",maxcost);
    62     }
    63     else{
    64         printf("Impossible
    ");
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    键盘事件
    冒泡事件-捕获事件-阻止事件
    Date()常用属性
    dom树节点的增删改插
    boost/c++11 变量类型打印、相等判断以及成员函数指针相关
    c++ std:call_once 与 单例模式实现
    c++11 异步编程 std::async
    c++ STL中一些常用函数/模板
    c++11 std::atomic 原子操作
    C++ std::atomic_flag 实现spinLock
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4756411.html
Copyright © 2011-2022 走看看