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) 收藏 举报

浙公网安备 33010602011771号