08-图8 How Long Does It Take(c语言)

题目: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嘛,代码可能写的不好,兄弟们见谅了。欢迎评论区大家一起讨论。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值