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 (≤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

解释:topsort可以看成又bfs改编而来,都是通过队列存储入度为0的元素,再加上一点类似dijkstra的判断就可以了。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=105;
const int inf=999999;
int G[maxn][maxn],dis[maxn];
vector<int> in(maxn);//入度
int n,m;
void topSort(){
    int cnt=0,leastTime=0;
    queue<int> q;
    for(int i=0;i<n;i++){
        if(!in[i]) q.push(i);//将入度为0的入队
    }
    while(!q.empty()){
        int u=q.front();
        q.pop();
        cnt++;
        for(int v=0;v<n;v++){
            if(G[u][v]!=inf){
                if(--in[v]==0) q.push(v);//入度为0就入队
                if(dis[u]+G[u][v]>dis[v]) dis[v]=dis[u]+G[u][v];//永远取最长的
                if(dis[v]>leastTime) leastTime=dis[v];//记录最长耗时
            }
        }
    }
    if(cnt==n) cout<<leastTime<<endl;
    else cout<<"Impossible\n";
}
int main()
{
    fill(G[0],G[0]+maxn*maxn,inf);
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        G[a][b]=c;
        in[b]++;
    }
    topSort();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小火汁猛猛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值