提高组较复杂图论I
Posted jian-song
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了提高组较复杂图论I相关的知识,希望对你有一定的参考价值。
P1113 杂务
*拓扑排序模板。
#include<bits/stdc++.h> #define For(i,l,r) for(int i=l;i<=r;i++) using namespace std; const int M=10005; queue<int>q; int n,ans,mx[M],in[M],t[M]; bool e[M][M]; inline void toposort(){ For(i,1,n){ if(!in[i]){q.push(i);mx[i]=t[i];} } while(!q.empty()){ int u=q.front();q.pop(); For(i,1,n){ if(e[u][i]){ in[i]--; if(!in[i]) q.push(i); mx[i]=max(mx[i],mx[u]+t[i]); } } } For(i,1,n) ans=max(ans,mx[i]); } int main(){ scanf("%d",&n); For(i,1,n){ int a,b,c; scanf("%d%d%d",&a,&b,&c); t[a]=b; while(c!=0){ in[a]++; e[c][a]=1; scanf("%d",&c); } } toposort(); printf("%d",ans); return 0; }
*更妙的做法在下面,更考验思维,跟我的想法相似,但实现更妙。
*因为其前驱一定在他之前读入,所以读入任务时每次从其前驱中选一个耗时最长的转移,同时更新最后答案。
#include<bits/stdc++.h> #define For(i,l,r) for(int i=l;i<=r;i++) using namespace std; int n,l,t,ans[10005],maxans,id,tme; int main(){ scanf("%d",&n); For(i,1,n){ scanf("%d",&id); scanf("%d",&tme); int tmp=0; while(scanf("%d",&t)&&t) tmp=max(ans[t],tmp); ans[id]=tmp+tme; maxans=max(ans[i],maxans); } printf("%d ",maxans); return 0; }
*WA因为心态,题目容易便略加思考就打代码,没去证明正确性&思考代码大概怎么打。
以上是关于提高组较复杂图论I的主要内容,如果未能解决你的问题,请参考以下文章