POJ 3159 Candies---差分约束系统

是一道裸的差分约束系统,无需建图,不等式关系已经直接给出。第一次用链接表写了SPFA,还不是很熟练。。。关于链接表还得再学习一下。。

这题需要注意的是,不能用队列做,只能用栈,否则会超时。

题目链接:http://poj.org/problem?id=3159

              题目意思:flymouse是班里的班长,她(假设是女的哈)从老师那里拿来了一袋糖果,要发给班里的同学。好吧,flymouse与snoopy平时在班里是死对头,这下子,他(假设是男的啦)是要倒霉了。由于班里的同学都喜欢吃糖,但是每个同学都要说出一个条件,那就是A认为B同学的糖不能比他的多C,flymouse在发糖的时候要满足所有同学的要求,现在问,flymouse如何给每个同学发糖,最后能使自己的糖的数量比snoopy多的最多,输出这个数量,假设同学的编号为1-n,其中snoopy为1号,flymouse为n号!

代码:

 

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<stack>
 4 #include<cstring>
 5 using namespace std;
 6 #define maxn 30005
 7 #define maxm 150005
 8 #define INF 0x3f3f3f3f
 9 struct Edge{
10     int v;
11     int w;
12 }edge[maxm];
13 int next[maxm],node[maxn],vis[maxn],dist[maxn],m,n;
14 void spfa()
15 {
16     int i;
17     memset(vis,0,sizeof(vis));
18     stack<int> q;
19     for(i=0;i<=n;i++)
20         dist[i]=INF;
21     dist[1]=0;
22     q.push(1);
23     vis[i]=1;
24     while(!q.empty())
25     {
26         int x=q.top();
27         q.pop();
28         vis[x]=0;
29         for(int r=node[x];r!=-1;r=next[r])
30         {
31             if(dist[edge[r].v]>dist[x]+edge[r].w)
32             {
33                 dist[edge[r].v]=dist[x]+edge[r].w;
34                 if(!vis[edge[r].v])
35                 {
36                     q.push(edge[r].v);
37                     vis[edge[r].v]=1;
38                 }
39             }
40         }
41     }
42 }
43 int main()
44 {
45     int u,v,w;
46     while(~scanf("%d %d",&n,&m))
47     {
48         memset(node,-1,sizeof(node));
49         int i=1;
50         while(m--)
51         {
52             scanf("%d %d %d",&u,&v,&w);
53             edge[i].v=v;
54             edge[i].w=w;
55             next[i]=node[u];
56             node[u]=i++;
57         }
58         spfa();
59         printf("%d\n",dist[n]);
60     }
61     return 0;
62 }

 

 

 

posted on 2013-02-04 10:55  acoderworld  阅读(62)  评论(0)    收藏  举报

导航