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

来源:互联网 发布:行楷字帖 知乎 编辑:程序博客网 时间:2024/04/28 12:48

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 120 1 60 2 40 3 51 4 12 4 13 5 25 4 04 6 94 7 75 7 46 8 27 8 4
Sample Output 1:
18
Sample Input 2:
4 50 1 10 2 22 1 31 3 43 2 5
Sample 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;}








0 0
原创粉丝点击