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
#include<iostream>
#include<vector>
#include<queue>
#include<stdio.h>
#include<utility>
using namespace std;
int Nv,Ne;
vector<int>G[105];
struct Node{
int in;//入度
int earliest;//最早完成时间
vector<pair<int,int>>V;//pair<to,weight>,存放边
}N[105];
void Read(){
int a;
int b;
int c;
for(int i=0;i<Nv;i++){
N[i].in=0;
N[i].earliest=0;
}
for(int i=0;i<Ne;i++){
cin>>a>>b>>c;
N[b].in++;
G[a].push_back(b);
G[b].push_back(a);
N[a].V.push_back(make_pair(b,c));
}
}
void TopSort(){
int cnt=0;
int LeastTime=0;
queue<int>Q;
for(int i=0;i<Nv;i++){
if(N[i].in==0)
Q.push(i);
}
while (Q.size()>0){
int temp=Q.front();
Q.pop();
cnt++;
int lenv=N[temp].V.size();
for(int i=0;i<lenv;i++){
int to=N[temp].V[i].first;
int weight=N[temp].V[i].second;
N[to].in--;
if(N[to].in==0) Q.push(to);
N[to].earliest=max(N[to].earliest,N[temp].earliest+weight);
LeastTime=max(N[to].earliest,LeastTime);
}
}
if(cnt==Nv)
cout<<LeastTime<<endl;
else
cout<<"Impossible"<<endl;
}
void Print(){
for(int i=0;i<Nv;i++){
cout<<"Node: "<<i<<"Time: "<<N[i].earliest<<endl;
}
}
int main(){
//freopen("in1.txt","r",stdin);
cin>>Nv>>Ne;
Read();
TopSort();
//Print();
//fclose(stdin);
return 0;
}