一个大工程分成n个子工程,某些子工程之间有相互依赖的关系,比如:b依赖于a,a必须先完成,才能开始完成b,已知完成每个子工程的时间和依赖关系,求n个子工程完成的最小时间。
标签:style ace ring while gre log int 时间 tin
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int read() { int x=0,y=1; char ch=getchar(); while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) y=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar(); } return x*y; } struct edge { int next,to; } e[300045]; int pro[100045],cnt,head[100045],f[100045],du[100045]; void add(int from,int to) { e[++cnt].next=head[from]; e[cnt].to=to; head[from]=cnt; } int dfs(int x) { if(f[x]) return f[x]; int p=head[x],sum=pro[x],maxx=0; // printf("x=%d\n",x); while(p!=-1) { f[e[p].to]=dfs(e[p].to); if(f[e[p].to]>maxx) maxx=f[e[p].to]; p=e[p].next; } sum+=maxx; return sum; } int main() { memset(head,-1,sizeof(head)); int n=read(),m=read(),x,y,maxn=-2e8; for(int i=1; i<=n; i++) pro[i]=read(); for(int i=1; i<=m; i++) { x=read(),y=read(); du[y]++; add(x,y); } for(int i=1; i<=n; i++) { if(du[i]) continue; int l=dfs(i); // printf("%d %d\n",i,l); if(l>maxn) maxn=l; } cout<<maxn; return 0; }
标签:style ace ring while gre log int 时间 tin
原文地址:http://www.cnblogs.com/gshdyjz/p/7027864.html