英文不是很好的我看了好久才知道什么意思![尴尬](http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif)
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>
using namespace std;
#define maxNv 100
#define maxtime 100000
int flag=1;
vector<int> earliest(maxNv,0);
queue<int> q;
vector<int> rudu(maxNv,0);
struct graph{
int Nv,Ne;
int G[maxNv][maxNv];
};
using Graph=graph*;
struct enode{
int v1,v2;
int time;
};
using edge=enode*;
Graph CreateGraph()
{
Graph gra=new graph();
cin>>gra->Nv>>gra->Ne;
for(int i=0;i<gra->Nv;i++)
for(int j=0;j<gra->Nv;j++)
gra->G[i][j]=maxtime;
return gra;
}
void Insert(edge e,Graph gra){
gra->G[e->v1][e->v2]=e->time;
rudu[e->v2]++;
}
Graph BuildGraph(){
Graph gra=CreateGraph();
edge e=new enode();
for(int i=0;i<gra->Ne;i++){
cin>>e->v1>>e->v2>>e->time;
Insert(e,gra);
}
return gra;
}
void timeset(int v1,Graph gra){
int f=0;
for(int i=0;i<gra->Nv;i++)
if(gra->G[i][v1]!=maxtime&&earliest[i]+gra->G[i][v1]>f)
f=earliest[i]+gra->G[i][v1];
earliest[v1]=f;
}
void solve(Graph gra){
int v1=0,v2=0;
for(int i=0;i<gra->Nv;i++)
if(rudu[i]==0) {
q.push(i);
earliest[0]=0;
}
while(!q.empty()){
v1=q.front();
q.pop();
rudu[v1]--;
timeset(v1,gra);
for(v2=0;v2<gra->Nv;v2++)
if(gra->G[v1][v2]!=maxtime&&rudu[v2]!=-1){
rudu[v2]--;
if(rudu[v2]==0) q.push(v2);}
}
// for(int i=0;i<gra->Nv;i++)
// cout<<rudu[i]<<" ";
// cout<<endl;
for(int i=0;i<gra->Nv;i++)
if(rudu[i]!=-1) flag=0;
if(flag==0) cout<<"Impossible";
else{
int time=-1;
for(int i=0;i<gra->Nv;i++)
if(earliest[i]>time) time=earliest[i];
cout<<time;
}
}
int main()
{
Graph gra=BuildGraph();
solve(gra);
return 0;
}