提高组较复杂图论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;
}
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
",maxans);
    return 0;
 } 
View Code

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

 

以上是关于提高组较复杂图论I的主要内容,如果未能解决你的问题,请参考以下文章

图论_最短路径

图论-最短路算法

CodeForces1070A Find a Number 图论

图论之存图

图论基础知识.

算法提高课——图论