题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4109
题目大意:有n条指令和m条指令之间的依赖关系,对于每一组关系u v w表示指令v必须在指令u之后w执行,且执行需要w个时间单位,问你要执行n条指令最少需要消耗的时间(多条无依赖关系的指令可同时执行)
分析:裸的关键路径。
实现代码如下:
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N=1005;
struct EDGE
{
int to,w;
int id;
int nex;
}edge[N*10];
int head[N];
int n,m,cnt;
int ind[N];
int Ee[N],El[N],e[N],l[N];
//事件Ee(El)最早(晚)开始的时间,活动a最早(晚)开始的时间e(l)
void init()
{
cnt=0;
memset(head,-1,sizeof(head));
memset(ind,0,sizeof(ind));
memset(Ee,0,sizeof(Ee));
}
void add(int u,int v,int w)
{
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].nex=head[u];
head[u]=cnt++;
}
void Top_sort()
{
queue <int> que;
for(int i=0;i<n;i++)
if(ind[i]==0)
{
que.push(i);
Ee[i]=1;
}
while(!que.empty())
{
int x=que.front();
que.pop();
for(int k=head[x];k!=-1;k=edge[k].nex)
{
if(--ind[ edge[k].to ]==0)
que.push(edge[k].to);
if(Ee[ edge[k].to ]<Ee[x]+edge[k].w)
Ee[ edge[k].to ]=Ee[x]+edge[k].w;
}
}
}
void solve()
{
int ans=0;
Top_sort();
for(int i=0;i<n;i++)
ans=max(ans,Ee[i]);//找出最长路径即可
printf("%d\n",ans);
}
int main()
{
while(scanf("%d%d",&n,&m)!=-1)
{
init();
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
ind[v]++;
}
solve();
}
return 0;
}