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\n",i,d[i]); if(adj[i]==-1&&maxx<d[i]) maxx=d[i]; } printf("%lld\n",maxx); } return 0; }