您的位置:首页 > 其它

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

2015-06-19 11:26 183 查看
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


提交代

————————————————

这个题目有几个坑,被我趟了。。。。

知识点如下。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: