传送门
数据量较小(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");
}