POJ 3159 Candies
2011-01-29 23:17
411 查看
典型差分约束,求最大值,按照最短路构图
根据题意,Sb-Sa<=c,于是a向b连一条权为c的边
这题似乎是卡队列的,我一开始写的普通的spfa+队列,WA了,想了下,可能是队列大小不够,于是开到30000×100,还是WA,再开到30000*500,变成TLE了
后来又换成循环队列,还是TLE,于是看了DISCUSS用spfa+栈,500MS,又学了一招
代码:
根据题意,Sb-Sa<=c,于是a向b连一条权为c的边
这题似乎是卡队列的,我一开始写的普通的spfa+队列,WA了,想了下,可能是队列大小不够,于是开到30000×100,还是WA,再开到30000*500,变成TLE了
后来又换成循环队列,还是TLE,于是看了DISCUSS用spfa+栈,500MS,又学了一招
代码:
#include<iostream> using namespace std; const int MAX=30005; const int inf=1<<30; struct node { int v,w,next; }g[MAX*10]; int dis[MAX],adj[MAX],s[MAX],vis[MAX]; int n,m,e; void add(int u,int v,int c) { g[e].v=v; g[e].w=c; g[e].next=adj[u]; adj[u]=e++; } void spfa() { int top=0,i,u,v; for(i=1;i<=n;i++) dis[i]=inf; dis[1]=0; memset(vis,0,sizeof(vis)); s[++top]=1; vis[1]=1; while(top) { u=s[top--]; //cout<<u<<endl; vis[u]=0; for(i=adj[u];i!=-1;i=g[i].next) { v=g[i].v; if(dis[v]>dis[u]+g[i].w) { dis[v]=dis[u]+g[i].w; if(!vis[v]) { s[++top]=v; vis[v]=1; } } } } } int main() { int a,b,c; memset(adj,-1,sizeof(adj)); e=0; scanf("%d%d",&n,&m); while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } spfa(); cout<<dis <<endl; return 0; }
相关文章推荐
- poj 3159 Candies------spfa算法
- POJ 3159 Candies
- poj 3159 Candies(差分约束原理 最短路)
- POJ 3159 Candies (栈优化spfa)
- poj3159——Candies
- POJ-3159-Candies
- POJ 3159 Candies 解题报告(Dijkstra & SPFA) 及 双向Dijkstra性能测试
- (简单) POJ 3159 Candies,Dijkstra+差分约束。
- POJ 3159 Candies(差分规划+SPFA)
- poj-3159 Candies(差分约束问题)
- POJ 3159 Candies (差分约束 Dijkstra+优先队列 SPFA+栈)
- poj 3159 candies (差分约束 spfa+stack)
- POJ-3159 Candies(差分约束)
- poj 3159 Candies (spfa+stack)
- POJ 3159 Candies 差分约束
- POJ 3159 Candies
- poj 3159 Candies
- POJ 3159 Candies
- POJ 3159 Candies 差分约束系统(这题卡SPFA的队列的双端队列)
- POJ 3159 Candies (差分约束 Dijkstra+优先队列 SPFA+栈)