首页 > 其他 > 详细

【提高组】较复杂图论I

时间:2019-10-30 18:49:47      阅读:76      评论:0      收藏:0      [点我收藏+]

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;
}
View Code

*更妙的做法在下面,更考验思维,跟我的想法相似,但实现更妙。

*因为其前驱一定在他之前读入,所以读入任务时每次从其前驱中选一个耗时最长的转移,同时更新最后答案。

技术分享图片
#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\n",maxans);
    return 0;
 } 
View Code

*WA因为心态,题目容易便略加思考就打代码,没去证明正确性&思考代码大概怎么打。

 

【提高组】较复杂图论I

原文:https://www.cnblogs.com/jian-song/p/11766396.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!