poj 3159 Candies(差分约束 spfa stack实现)
2013-11-09 15:49
387 查看
/* 又是一道差分约束的题目。。。一样的,又被卡了好久 - -。 题目意思很好懂。 这个差分约束用spfa的主要就是spfa要用stack实现而不能用queue来实现。 这个就体现出stack实现的快速优势。 用queue会光荣的交上一次tle 可以用stl里的stack,也可自己写,自己写的要比stl的快的多。 我在下面都给出了,应该是自己写的stack要比stl的stack要快200ms左右,还是很可观的。 */ #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<stack> using namespace std; const int inf = 0x3f3f3f3f; const int N = 30010; int n,m; typedef struct { int to; int next; int w; } Node; Node edge[N*5]; int dis ; int vis ; int head ; int inqueue ; int num_edge; void addedge(int a,int b,int w) { edge[num_edge].to = b; edge[num_edge].w = w; edge[num_edge].next = head[a]; head[a] = num_edge++; } /****************************************************************************************/ bool spfa(int start)/*stl stack 实现*/ { memset(vis,false,sizeof(vis)); memset(dis,0x3f,sizeof(dis)); stack<int>s; s.push(start); vis[start] = true; dis[start] = 0; inqueue[start]++; while(!s.empty()) { int cur = s.top(); s.pop(); for(int i = head[cur] ; i != -1 ; i = edge[i].next) { int x = edge[i].to; if(dis[x] > dis[cur] + edge[i].w ) { dis[x] = dis[cur] + edge[i].w; if(!vis[x]) { s.push(x); vis[x] = true; inqueue[x]++; if(inqueue[x] > n) { return false; } } } } vis[cur] = false; } return true; } /*******************************************************************************************/ /*******************************************************************************************/ int s ;/*数组模拟stack 实现,效率比stl要快*/ bool spfa(int start) { int top; memset(dis,0x3f,sizeof(dis)); memset(vis,false,sizeof(vis)); dis[start] = 0; s[0] = start; top = 1; vis[start] = true; while(top) { int cur = s[--top]; for(int i = head[cur] ; i != -1 ; i = edge[i].next) { int x = edge[i].to; if(dis[x] > dis[cur] + edge[i].w) { dis[x] = dis[cur] + edge[i].w; if(!vis[x]) { s[top++] = x; vis[x] = true; } } } vis[cur] = false; } return true; } /**********************************************************************************************************/ int main() { while(scanf("%d %d",&n,&m) != EOF) { memset(head,-1,sizeof(head)); int a,b,w; num_edge = 0; for(int i = 0 ; i < m ; i++) { scanf("%d %d %d",&a,&b,&w); addedge(a,b,w); } spfa(1); cout<<dis <<endl; } return 0; }
相关文章推荐
- POJ 3159 Candies 差分约束-SPFA栈实现
- POJ 3159 Candies(差分约束,最短路)
- POJ 3159 Candies 差分约束 spfa+栈+邻接表
- poj-3159 Candies(差分约束问题)
- POJ3159 Candies(差分约束)
- POJ 题目3159 Candies(差分约束)
- POJ 3159 Candies(差分约束)
- POJ3159_Candies_差分约束_SPFA
- POJ 3159 Candies 【差分约束】
- [poj 3159]Candies[差分约束详解][朴素的考虑法]
- POJ-3159 Candies 最短路应用(差分约束)
- poj 3159 Candies (差分约束)
- POJ 3159 Candies(差分约束)
- POJ - 3159 Candies (变形的最短路问题)差分约束,栈版本SPFA,前向星建图
- POJ 3159 Candies(差分约束)
- POJ 3159 Candies (差分约束 Dijkstra+优先队列 SPFA+栈)
- POJ 3159 Candies (差分约束 Dijkstra+优先队列 SPFA+栈)
- POJ 3159 Candies 还是差分约束(栈的SPFA)
- POJ-3159 Candies( 差分约束 )
- POJ 3159 Candies(差分约束)