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;
}
原文地址:https://www.cnblogs.com/assult/p/3237904.html