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 

posted on 2010-10-22 02:29 yzhw 阅读(326) 评论(0)  编辑 收藏 引用 所属分类: graph


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜