POJ 3159 Candies
2011-08-15 20:56
253 查看
POJ_3159[/b]
一开始我想多了,有段时间就在想如果图不连通该添加一些什么约束条件。但后来突然发现,如果最后N和1不连通的话,那么这个题就无解了,想到这,题目就变的简单了,因为只有一个约束条件,d[A]-d[B]>=-c,然后将d[1]看做0,以1为起点求一个到N的最短路就可以了。
此外,这个题在用SPFA的时候,如果用循环队列会超时,而用栈就没有问题,具体的原理我也不清楚。
一开始我想多了,有段时间就在想如果图不连通该添加一些什么约束条件。但后来突然发现,如果最后N和1不连通的话,那么这个题就无解了,想到这,题目就变的简单了,因为只有一个约束条件,d[A]-d[B]>=-c,然后将d[1]看做0,以1为起点求一个到N的最短路就可以了。
此外,这个题在用SPFA的时候,如果用循环队列会超时,而用栈就没有问题,具体的原理我也不清楚。
#include<stdio.h> #include<string.h> int first[31000],next[151000],v[151000],w[151000]; int s[31000],ins[31000],d[31000]; int main() { int i,j,k,N,M,e,u,top,A,B,c; while(scanf("%d%d",&N,&M)==2) { memset(first,-1,sizeof(first)); for(e=0;e<M;e++) { scanf("%d%d%d",&A,&B,&c); v[e]=B; w[e]=c; next[e]=first[A]; first[A]=e; } for(i=1;i<=N;i++) { ins[i]=0; d[i]=1000000000; } d[1]=0; top=0; s[top++]=1; while(top!=0) { u=s[--top]; ins[u]=0; for(e=first[u];e!=-1;e=next[e]) if(d[u]+w[e]<d[v[e]]) { d[v[e]]=d[u]+w[e]; if(!ins[v[e]]) { s[top++]=v[e]; ins[v[e]]=1; } } } printf("%d\n",d ); } return 0; }
相关文章推荐
- POJ 3159 Candies 还是差分约束(栈的SPFA)
- POJ-3159 Candies
- POJ 3159 Candies(差分约束+SPFA )
- 【POJ 3159】Candies
- POJ 3159 Candies(差分约束 转spfa+stack 求最短路径)
- POJ 3159 Candies 还是差分约束(栈的SPFA)
- poj 3159 Candies(差分约束)
- POJ 3159 Candies
- POJ 3159 - Candies
- Poj 3159 Candies
- poj 3159 Candies
- poj 3159 Candies
- POJ-3159 Candies 最短路应用(差分约束)
- POJ 3159 - Candies(查分约束)
- [poj 3159]Candies[差分约束详解][朴素的考虑法]
- poj--3159--Candies(简单差分约束)
- POJ 3159 Candies
- POJ 3159 Candies(差分约束系统)
- 【POJ 3159】Candies(差分约束+SPFA)
- poj 3159 Candies