zoukankan      html  css  js  c++  java
  • Test for Job spfa变形 注意精度

    http://poj.org/problem?id=3249

    题意:给出一个有向图图  每点有一个权值 全职有正有负 找从任意一点出发的总权值最大的路径 输出其最大值

    用spfa 。。 初始把入度为0的点加入队列 因为数值很大 所以要用到longlong 型

    注意 最后输出maxx 也要是longlong型 一开始没注意到这个 wa很久 搞得人都要抓狂了

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<queue>
    #define INF 1000000000
    using namespace std;
    struct E {int to;int next;}edge[2000002];
    int w[100012],adj[100012],num,in0[100012],vis[100002];
    queue<int > q;
    long long d[100012];
    void add(int a,int b)
    {
        edge[num].to =b;
        edge[num].next =adj[a];
        adj[a]=num++;
    }
    
    
    
    int main()
    {
        int i,j,n,m,a,b,t,v;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(i=1;i<=n;i++)
                scanf("%d",&w[i]);
            memset(adj,-1,sizeof(adj));
            memset(in0,0,sizeof(in0));
            for(i=1;i<=n;i++)
                d[i]=-1*INF;
            num=0;
            while(m--)
            {
                scanf("%d%d",&a,&b);
                add(b,a);
                in0[a]=1;   //rudu  buwei 0
            }
            memset(vis,0,sizeof(vis));
            long long  max1=-1*INF;
            for(i=1;i<=n;i++)
                if(in0[i]==0)
                {
                    q.push (i);
                    d[i]=w[i];
                    vis[i]=1;
                }
                while(!q.empty ())
                {
                    t=q.front ();q.pop ();vis[t]=0;
                    for(i=adj[t];i!=-1;i=edge[i].next )
                    {
                        v=edge[i].to ;
                        if(d[v]<d[t]+w[v])
                        {
                            d[v]=d[t]+w[v];
                            if(!vis[v])
                            {
                                q.push (v);
                                vis[v]=1;
                            }
                        }
                    }
                }
                long long maxx=-1*INF;
                for(i=1;i<=n;i++)
                {
                    //printf("i %d %d
    ",i,d[i]);
                    if(adj[i]==-1&&maxx<d[i])
                        maxx=d[i];
                    }
                printf("%lld
    ",maxx);
            
        }
        return 0;
    }
  • 相关阅读:
    gdb --configuration
    firecracker 编译
    gvisor 编译
    gvisor
    rust Deref
    rust explicit
    rust move
    rust drop
    出租人对经营租赁的会计处理
    关于以公允价值计量的投资性房地产的处置
  • 原文地址:https://www.cnblogs.com/assult/p/3237904.html
Copyright © 2011-2022 走看看