pku3249 Test for Job SPFA最长路

pku3249 Test for Job SPFA最长路

题意这样的:一个无向图,一个员工从a走到b,每点都有一个权值,可能为正或者负,要求给出一条路径,使得到b以后经过权值和最大。
还是用神通广大的SPFA,当求最长路来办- -贴代码
 1  # include  < cstdio >
 2  # include  < cstring >
 3  using   namespace  std;
 4  # define N  100005
 5  # define M  1000005
 6  # define max(a,b) ((a) > (b) ? (a):(b))
 7  int  g[N],v[M],nxt[M],c,val[N],q[N],s,e,n,m,id[N],od[N];
 8  int  dp[N];
 9  int  main()
10  {
11       while (scanf( " %d%d " , & n, & m) != EOF)
12      {
13         memset(g, - 1 , sizeof (g));
14         c = 0 ;
15         s = e =- 1 ;
16         memset(id, 0 , sizeof (id));
17         memset(od, 0 , sizeof (od));
18          for ( int  i = 1 ;i <= n;i ++ )
19           dp[i] =- 0xfffffff ;
20          for ( int  i = 1 ;i <= n;i ++ )
21           scanf( " %d " ,val + i);
22          while (m -- )
23         {
24             int  a,b;
25            scanf( " %d%d " , & a, & b);
26            v[c] = b;
27            nxt[c] = g[a];
28            g[a] = c ++ ;
29            od[a] ++ ;
30            id[b] ++ ;
31         }
32          for ( int  i = 1 ;i <= n;i ++ )
33            if ( ! id[i])
34           {
35              dp[i] = val[i];
36              q[ ++ e] = i;
37           } 
38          int  res =- 0xfffffff ;
39          while (s != e)
40         {
41             int  top = q[ ++ s];
42             if ( ! od[top])
43               res = max(res,dp[top]);
44             for ( int  p = g[top];p !=- 1 ;p = nxt[p])
45            {
46                dp[v[p]] = max(dp[v[p]],dp[top] + val[v[p]]);
47                id[v[p]] -- ;
48                 if ( ! id[v[p]])
49                   q[ ++ e] = v[p];
50            }
51         }
52        
53         printf( " %d\n " ,res);
54      }
55       return   0 ;
56  }
57 

你可能感兴趣的:(pku3249 Test for Job SPFA最长路)