zoukankan      html  css  js  c++  java
  • HDU 4109 Instrction Arrangement(DAG上的最长路)

    把点编号改成1-N,加一点0,从0点到之前任意入度为0的点之间连一条边权为0的边,求0点到所有点的最长路。

    SPFA模板留底用

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <string>
    #include <iostream>
    #include <cmath>
    #define ll long long
    #define inf 1000000000
    #define maxn 1010
    using namespace std;
    
    struct Edge
    {
        int from,to;
        int dist;
        Edge(int a,int b,int c)
        {
            from=a,to=b,dist=c;
        }
    };
    struct SPFA
    {
        int n,m;
        vector<Edge> edges;
        vector<int> g[maxn];
        int d[maxn];
        int p[maxn];
        int cnt[maxn];
        bool inq[maxn];
    
        void init(int n_)
        {
            n=n_;
            int i;
            for(i=0; i<=n; i++)
            {
                g[i].clear();
            }
            edges.clear();
        }
    
        void addedge(int from,int to,double dist)
        {
            edges.push_back(Edge(from,to,dist));
            m=edges.size();
            g[from].push_back(m-1);
        }
    
        void spfa(int s)
        {
            int i;
            queue<int> q;
            memset(inq,0,sizeof(inq));
            memset(cnt,0,sizeof(cnt));
            for(i=0; i<=n; i++)
            {
                d[i]=-inf;
            }
            d[s]=0;
            inq[s]=true;
            q.push(s);
            while(!q.empty())
            {
                int u=q.front();
                q.pop();
                inq[u]=false;
                for(i=0; i<g[u].size(); i++)
                {
                    Edge& e=edges[g[u][i]];
                    if(d[e.to]<d[u]+e.dist)
                    {
                        d[e.to]=d[u]+e.dist;
                        p[e.to]=g[u][i];
                        if(!inq[e.to])
                        {
                            q.push(e.to);
                            inq[e.to]=true;
                        }
                    }
                }
            }
            int ans=0;
            for(i=1;i<=n;i++)
            {
                ans=max(ans,d[i]);
            }
            printf("%d
    ",ans+1);
        }
    };
    SPFA solver;
    int N,M;
    int ru[maxn];
    
    int main()
    {
       // freopen("input.txt","r",stdin);
        while ( scanf( "%d%d", &N, &M ) == 2 )
        {
            memset( ru, 0, sizeof(ru) );
            solver.init(N);
            for ( int i = 0; i < M; ++i )
            {
                int u, v, w;
                scanf( "%d%d%d", &u, &v, &w );
                u++,v++;
                ++ru[v];
                solver.addedge(u, v, w );
            }
            for ( int i = 1; i <= N; ++i )
            {
                if ( ru[i] == 0 )
                    solver.addedge( 0, i, 0 );
            }
            solver.spfa(0);
        }
        return 0;
    }
  • 相关阅读:
    Java注解
    java反射简单入门
    java泛型反射
    BeanUtils.populate的作用
    适配器模式
    原型模式
    抽象工厂模式
    工厂方法模式
    建造者模式
    单例模式
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3338301.html
Copyright © 2011-2022 走看看