学习小结——SPFA
2011-07-23 00:08
120 查看
今天看了下SPFA算法,写了个模板。。。
真是神物啊。。。理论上O(m)的复杂度下界。。。竟然能达到O(km)的程度。。。
真是神物啊。。。理论上O(m)的复杂度下界。。。竟然能达到O(km)的程度。。。
#include <stdio.h> #include <string.h> #define MAXN 100 #define inf 100000000 int head[MAXN],pnt[MAXN*MAXN],next[MAXN*MAXN],length[MAXN*MAXN]; int dist[MAXN],prev[MAXN]; int inqueue[MAXN]; int queue[2*MAXN]; int n; int a,b,len; int tot; void addedge(int a,int b,int len) { pnt[tot]=b; length[tot]=len; next[tot]=head[a]; head[a]=tot++; } void spfa(int src) { for(int i=0; i<n; i++) { dist[i]=inf; prev[i]=-1; } int qhead,qtail; qhead=0; qtail=0; queue[qtail++]=src; inqueue[src]=1; dist[src]=0; while(qhead<qtail) { int idx=head[queue[qhead]]; while(~idx) { if(dist[queue[qhead]]+length[idx] < dist[pnt[idx]]) { dist[pnt[idx]]=dist[queue[qhead]]+length[idx]; prev[pnt[idx]]=queue[qhead]; queue[qtail++]=pnt[idx]; inqueue[pnt[idx]]=1; } idx=next[idx]; } inqueue[queue[qhead]]=0; qhead++; } } int main() { tot=0; memset(inqueue,0,sizeof(inqueue)); memset(head,-1,sizeof(head)); memset(next,-1,sizeof(next)); scanf("%d",&n); while (scanf("%d%d%d",&a,&b,&len),~a) addedge(a,b,len); spfa(0); for(int i=0; i<n; i++) { printf("%d:",dist[i]); int idx=i; while (~idx) { printf("%d ",idx); idx=prev[idx]; } printf("\n"); } }
相关文章推荐
- Page 的生命周期学习小结
- 软件架构学习小结
- Excel VBA 学习总结 - 数据访问方式小结
- 关于后盾网yii框架的学习小结(10)--使用AR类的增删改查
- Ajax学习之小结
- 一个项目涉及到的50个Sql语句 学习小结
- Hibernate 学习小结
- 《Computer Networks (fifth edition)》第六章学习小结
- (2011.11.04) 汇编_王爽_第13章_学习小结
- C++顺序容器学习小结
- PHP正则表达式函数学习小结
- MySQL存储过程学习小结
- Android 资源(resource)学习小结
- Servlet 学习小结之doPost()方法和doGet()方法
- Linux设备驱动之button按键驱动学习与小结
- Linux Shell学习简单小结(更新中……)
- php学习个人小结
- CSS选择器学习小结
- [置顶] 阿里巴巴Java开发手册学习小结1-命名及常量定义
- oracle cursor 学习小结