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 4Sample Output 1:
18Sample Input 2:
4 5 0 1 1 0 2 2 2 1 3 1 3 4 3 2 5Sample Output 2:
Impossible
————————————————
这个题目有几个坑,被我趟了。。。。
知识点如下。
1,对于图中有环的判定。主要用到的是队列,入度和出度的概念。在云课堂上的拓扑排序中有讲解。
2,对于终点会有多个的情况下,需要找到最大值。遍历所有的出度为0的点。
3,
代码如下
#include <iostream>
#include <queue>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define MAX 110
#define INF 10000
#define max(a,b) (a)>(b)?(a):(b)
int N=0,M=0;
int cost[MAX][MAX];
int Earlist[MAX],indegree[MAX],outdegree[MAX];
void Creat()
{
cin>>N>>M;
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
cost[i][j]=-1;
}
Earlist[i]=0;
indegree[i]=0;
outdegree[i]=0;
}
for(int i=0; i<M; i++)
{
int v1,v2,c;
cin>>v1>>v2>>c;
cost[v1][v2]=c;//v1<v2!!
outdegree[v1]++;
indegree[v2]++;
}
}
int Ear()
{
queue<int> q;
int i=0,front=0;
for(i=0; i<N; i++)
{
if(indegree[i]==0)
{
q.push(i);
indegree[i]--;
}
}
int cnt=0;
while(!q.empty())
{
front=q.front();q.pop();
cnt++;
for(i=0; i<N; i++)
{
if(cost[front][i] >=0)
{
indegree[i]--;
Earlist[i]=max(Earlist[i],Earlist[front]+cost[front][i]);
}
}
for(i=0; i<N; i++)
{
if(indegree[i] == 0)
{
q.push(i);
indegree[i]--;
}
}
}
if(cnt==N)
{
return Earlist[front];
}
return -1;
}
int main(int argc, char** argv) {
int res=0;
Creat();
if(Ear()==-1)
{
cout<<"Impossible"<<endl;
}
else
{
for(int i=0; i<N; i++)
{
if(outdegree[i] == 0)
{
res=max(res,Earlist[i]);
}
}
cout<<res<<endl;
}
return 0;
}