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;
}