题目:https://www.luogu.org/problemnew/show/P1113
分析:
本题为关键路径。
只需要加边时稍作处理。
如果输入1 5 0,说明点1的入底为0,点的权值为5,这时令earlist[1]=5。
如果输入2 4 5 6 0,则加边,边权为4。
AC代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,x,y,w,cns,que[10005],ind[10005];
int num,head[10005];
int val[10005],earlist[10005],maxx;
struct Edge{
int to,w,next;
};
Edge edge[200005];
void join(int from,int to,int w){
edge[++num].next=head[from];
edge[num].to=to;
edge[num].w=w;
head[from]=num;
}
int main(){
memset(head,-1,sizeof(head));
cin>>n;
for(int i=1;i<=n;i++){
cin>>y>>w;
val[y]=w;
while(1){
cin>>x;
if(x==0)break;
join(x,y,w);
ind[y]++;
}
}
for(int i=1;i<=n;i++)
if(ind[i]==0){
que[++cns]=i;
earlist[i]=val[i];
}
while(cns){
x=que[cns--];
for(int i=head[x];i!=-1;i=edge[i].next){
y=edge[i].to;
w=edge[i].w;
if(earlist[y]<earlist[x]+w)earlist[y]=earlist[x]+w;
ind[y]--;
if(ind[y]==0)que[++cns]=y;
}
}
for(int i=1;i<=n;i++)
if(maxx<earlist[i])maxx=earlist[i];
cout<<maxx;
return 0;
}