码迷,mamicode.com
首页 > 其他好文 > 详细

【提高组】较复杂图论I

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

标签:san   bsp   c++   想法   tmp   view   using   sort   scanf   

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

标签:san   bsp   c++   想法   tmp   view   using   sort   scanf   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!