题目:How Long Does It Take
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".
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
题目就是陈越姥姥所讲的那个题(8.2讲),那题意就不用多说了,直接上码。
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#define max 105
#define INF 10000
int t[max][max];//邻接矩阵
typedef struct node edge;//记录指向该点的边有多少
struct node{
int ne;
};
edge t2[max];
int n,w;//点的个数和边的个数
void play()//初始化
{
for(int i=0;i<n;i++){
t2[i].ne=0;
for(int j=0;j<n;j++)
t[i][j]=INF;
}
for(int i=0;i<w;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
t[a][b]=c;
t2[b].ne++;
}
}
void to()//拓扑排序的缩写吧
{int sum[max],maxx=0,cnt=n;//cnt是用来判断是否成环的,sum[max]是表示各点完成工作所用的时间。
bool x[max];//将边为0的点进行标记
memset(sum,0,sizeof(sum));//初始化
memset(x,false,sizeof(x));//初始化
while(cnt)
{
int v=-1;//判断是否有边为0的点
for(int i=0;i<n;i++)//找边为0的点
if(t2[i].ne==0&&x[i]==false)
{
v=i;
cnt--;
break;
}
if(v==-1)
break;
x[v]=true;
for(int i=0;i<n;i++)//思路很简单
{
if(t[v][i]!=INF&&x[i]==false){
t2[i].ne--;
if(t[v][i]+sum[v]>sum[i]){
sum[i]=t[v][i]+sum[v];
}
}
}
}
if(cnt)//如果成环
{
printf("Impossible");
return ;
}
else {
for(int i=0;i<n;i++)
{
if(maxx<sum[i])
maxx=sum[i];
}
printf("%d",maxx);
}
}
int main()
{
scanf("%d %d",&n,&w);
play();
to();
}
第一次写csdn嘛,代码可能写的不好,兄弟们见谅了。欢迎评论区大家一起讨论。