SPFA
2016-09-24 11:03
197 查看
昨天给出了蹩脚的Bellman-Ford动态规划实现,今天给出一种更快的算法,SPFA。
在编程过程中遇到了两个问题:
1.没有充分考虑数组指向;
2.没有充分考虑递归过程中的条件制约。
希望大家可以帮忙看一下上一篇博客,解决一下那个问题。如果可以改进该算法,请各位大神不吝赐教。
Have fun coding,i_human.Have fun coding ,everyone!
THE CODE:// SPFA.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #define a 100 //a大于点数 #define b 10000 //当作正无穷使用 using namespace std; void improve(int k); void prin(); int used[a]; int edge[a][a]; int cost[a]; int pre[a]; int recond[a][a]; //自我发明 int n,e; int main() { int u,v,w; cin>>n>>e; for(int i=0;i<a;i++) for(int j=0;j<a;j++) edge[i][j]=b; for(int i=1;i<=n;i++) { pre[i]=0; used[i]=0; cost[i]=b; } used[1]=1; //默认1为源点 cost[1]=0; for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) recond[i][j]=0; for(int i=0;i<e;i++) { cin>>u>>v>>w; edge[u][v]=w; recond[u][recond[u][0]+1]=v; recond[u][0]++; } for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) cout<<recond[i][j]; cout<<endl; } improve(1); prin(); system("pause"); return 0; } void improve(int k) { int l=recond[k][0]; while(l>0) { if(used[recond[k][l]]>n) { cout<<"have negative circle"<<endl; system("pause"); exit(0); } if(cost[recond[k][l]]>cost[k]+edge[k][recond[k][l]]) { pre[recond[k][l]]=k; cost[recond[k][l]]=cost[k]+edge[k][recond[k][l]]; used[recond[k][l]]++; improve(recond[k][l]); } l--; } } void prin() { for(int i=2;i<=n;i++) { cout<<i<<"<--"; int l=pre[i]; while(l!=1 && l!=0) { cout<<l<<"<--"; l=pre[l]; } cout<<"1"<<endl; } }
相关文章推荐
- Palindrome Partitioning II
- 模板设计模式
- unity 5.x以上的粒子系统详解
- dpi px dip dp sp density 以及公式换算 整理
- 背景选择器 selector
- C++常用容器
- 两个不等式(Nopier)
- 注意这种方法的判断
- tomcat的环境配置
- 使用RSA证书加密敏感数据
- Redis应用场景
- 违禁词检索chrom扩展插件
- 百度前端面试经验之程序题
- 周末小记-ZooKeeper集群安装部署
- Layout属性笔记
- ubuntu16.04开机循环输入密码无法进入桌面的解决办法
- android color.xml
- Redis应用场景
- Codeforces Round #373 (Div. 2) B
- Java四类八种基本数据类型