HDU1385 Minimum Transport Cost(最短路输出路径)
2015-08-26 10:28
531 查看
题意:先给你一张你n * n的图,代表城市间的距离,然后,给出n个tax的费用,然后很多询问,问你a到b的最少费用,并且打印路径(字典序)
注意tax的费用起点和终点不算
逆序spfa:
注意tax的费用起点和终点不算
逆序spfa:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <cmath> #include <vector> #include <algorithm> using namespace std; #define maxn 1005 #define inf 1e8 int a[maxn][maxn],tax[maxn],dis[maxn],fa[maxn],ans[maxn],n,x,y,temp; bool vis[maxn]; void spfa() { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) { dis[i]=fa[i]=inf; vis[i]=false; } dis[y]=0; queue<int>q; q.push(y); vis[y]=true; while(!q.empty()) { temp=q.front(); q.pop(); for(int i=1;i<=n;i++) { if(-1==a[i][temp]||i==temp) continue; else { if(dis[temp]+tax[i]+a[i][temp]<dis[i]) { dis[i]=dis[temp]+tax[i]+a[i][temp]; fa[i]=temp; if(vis[i]==false) { q.push(i); vis[i]=true; } } else if(dis[temp]+tax[i]+a[i][temp]==dis[i]&&temp<fa[i]) fa[i]=temp; } } vis[temp]=false; } ans[0]=x; temp=0; while(fa[ans[temp]]!=inf) { ans[temp+1]=fa[ans[temp]]; temp++; } printf("From %d to %d :\nPath: ",x,y); for(int i=0;i<temp;i++) printf("%d-->",ans[i]); printf("%d\n",ans[temp]); printf("Total cost : %d\n\n",dis[x]-tax[x]); } int main() { while(~scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=1;i<=n;i++) scanf("%d",&tax[i]); while(~scanf("%d%d",&x,&y)&&x!=-1) { if(x!=y) spfa(); else { printf("From %d to %d :\n",x,y); printf("Path: %d\n",x); printf("Total cost : 0\n\n"); } } } return 0; }
相关文章推荐
- HDU1257最少拦截系统
- 【Leetcode】Jump Game 1,2
- 对于推送的理解与总结
- Ubuntu 12.04 LTS 中安装 windows 字体
- Android Studio中编码(乱码)问题
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
- POJ2388map的应用统计树的百分比,并按照字母顺序输出
- iOS5 ARC学习笔记:strong、weak等详解
- HDU3336——KMP算法
- JDBC、Hibernate、Mybaites处理数据的流程及对DAO的理解
- JPA EntityManager 获取session
- TQ2440 学习笔记—— 7、NOR Flash 和 NAND Flash
- 禁止proguard
- ios9 public beta 测试版 装机详细步骤
- Android—Handler.obtainMessage()与new Message()相比
- Linux命令之——ps命令详解
- 【编程之美】寻找最大的K个数
- Swift学习笔记系列——(17)错误处理
- ios真机调试 老是显示输入管理员的用户和密码
- OutMan——集合对象的内存管理、copy的介绍及使用