7-12 How Long Does It Take (25 point(s))

传送门
数据量较小(1e2),直接使用数组下标作为索引;

#include<iostream>
#include<cstring>
using namespace std;
int g[110][110];
int Time[110],d[110],q[110];
// 因为入队的顺序就是拓扑序
//则Time[i]是从开始到  当前队头是i的总时间; 
int m,n,res;
bool topsort()
{
    
    
	int head=0,tail=-1;
	for(int i=0;i<n;i++)
		if(!d[i])
			q[++tail]=i;
	while(head<=tail)
	{
    
    
		int t=q[head++];
		res=max(res,Time[t]);
		for(int i=0;i<n;i++)
			if(~g[t][i])
			{
    
    
				if(--d[i]==0)q[++tail]=i;
				Time[i]=max(Time[t]+g[t][i],Time[i]);
			}
	}
	return tail==n-1;
}
int main()
{
    
    
	cin>>n>>m;
	memset(g,-1,sizeof g);
	for(int i=0;i<m;i++)
	{
    
    
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=c;
		d[b]++; 
	}
	if(topsort())
		printf("%d",res);
	else printf("Impossible");
}

猜你喜欢

转载自blog.csdn.net/weixin_49640089/article/details/114818146