PAT Advanced Level 1030. Travel Plan (30)(Java and C++)
来源:互联网 发布:匡恩网络太有钱了 编辑:程序博客网 时间:2024/06/05 11:40
PAT Advanced Level 1030. Travel Plan (30)
最短路径问题
我的思路:
1、SPFA算法,求出各个点的最短路径
2、DFS遍历,并将个各条到达目的地且路径最短的路线存储到pathVC
3、遍历pathVC求出minCost
看到别的大神有更加简便的思路:
思路(使用Dijkstra或者SPFA):比较大小时,将距离相同但花费更短也作为更新的条件之一
//比较大小时,将距离相同但花费更短也作为更新的条件之一 if (d[t]>d[v] + e.dis || (d[t] == d[v] + e.dis&&cost[t] > cost[v] + e.cost)) { d[t] = d[v] + e.dis; cost[t] = cost[v] + e.cost; pre[t] = v; que.push(P(d[t], t)); }
Java代码如下(AC):
import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Vector;public class Main{static Main instance =new Main();static int N;static int M;static int S;static int D;static int[] dis;static int[] cost;static int[] vis;static Vector<Edge>[] map ;static final int Inf =Integer.MAX_VALUE-10000;public static void main(String[] args){Scanner sc =new Scanner(System.in);N =sc.nextInt();M =sc.nextInt();S =sc.nextInt();D =sc.nextInt();map =new Vector[N];vis =new int[N];dis =new int[N];for(int i =0;i<N;i++){map[i]=new Vector<Edge>();vis[i]=0;dis[i]=Inf;}cost=new int[M];for(int i=0;i<M;i++){int c1 = sc.nextInt();int c2 = sc.nextInt();int distance = sc.nextInt();cost[i] = sc.nextInt();Edge e1 =instance.new Edge();e1.to=c2;e1.len = distance;e1.eCost = cost[i];map[c1].add(e1);Edge e2 =instance.new Edge();e2.to=c1;e2.len = distance;e2.eCost= cost[i];map[c2].add(e2);}SPFA(S);DFS(S,D,0);path.clear();int idx =-1;int minCost=Integer.MAX_VALUE;int[] shortedCost =new int[pathVC.size()];for(int i=0;i<pathVC.size();i++){path=pathVC.get(i);for(int j=0;j<path.size();j++){shortedCost[i] +=path.get(j).eCost;}if(minCost > shortedCost[i]){ minCost = shortedCost[i]; idx = i;}}path =pathVC.get(idx);System.out.print(S+" ");for(int i=0;i<path.size();i++){System.out.print(path.get(i).to+" ");}System.out.print(dis[D]);System.out.print(" ");System.out.print(minCost);}public static void SPFA(int st){Queue<Integer> q =new LinkedList<Integer>();q.add(st);dis[st]=0;vis[st]=1;while(!q.isEmpty()){int cur =q.poll();Vector<Edge> adjEdges =map[cur];for(int i =0;i<adjEdges.size();i++){int to =adjEdges.get(i).to;int len =adjEdges.get(i).len; if(dis[cur]+len <dis[to]){ dis[to]=dis[cur]+len; if(vis[to]==0){ vis[to]=1; q.add(to); } }}}}static Vector<Vector<Edge>> pathVC =new Vector<Vector<Edge>>();static Vector<Edge> path =new Vector<Edge>();public static void DFS(int st ,int des ,int distance){if(st==des){if(distance==dis[des]){Vector<Edge> onePath =new Vector<Edge>();for(int i=0;i<path.size();i++){onePath.add(path.get(i));}pathVC.add(onePath);}path.clear();return;}if(distance>dis[st]){path.clear();return;}Vector<Edge> adjEdges =map[st];for(int i=0;i<adjEdges.size();i++){Edge e =adjEdges.get(i);int to =e.to;int len =e.len;if(dis[st]+len<=dis[to]){path.add(e);DFS(to,des,dis[to]);}}path.clear();}class Edge{int to;int len;int eCost;}}
参考博客:
http://blog.csdn.net/gemire/article/details/20698375
0 0
- PAT Advanced Level 1030. Travel Plan (30)(Java and C++)
- 【PAT Advanced Level】1030. Travel Plan (30)
- 【PAT】【Advanced Level】1030. Travel Plan (30)
- PAT (Advanced) 1030. Travel Plan (30)
- PAT (Advanced Level) Practise 1030 Travel Plan (30)
- PAT (Advanced Level) Practise 1030 Travel Plan (30)
- Pat(Advanced Level)Practice--1030(Travel Plan)
- PAT (Advanced Level) 1030. Travel Plan (30) Dijkstra最短路径
- 1030. Travel Plan (30)【最短路+路径记忆】——PAT (Advanced Level) Practise
- [PAT]1030. Travel Plan (30)(Java实现)
- 1030. Travel Plan (30)-PAT
- 1030. Travel Plan (30) PAT
- PAT 1030. Travel Plan (30)
- PAT 1030. Travel Plan (30)
- PAT 1030. Travel Plan (30)
- 【PAT】1030. Travel Plan (30)
- pat 1030. Travel Plan (30)
- PAT 1030. Travel Plan (30)
- Jsoup 日记
- linux物理内存和虚拟内存的理解
- win7下载cmd中设置字符集位UTF-8
- 绝对URL的解析规则
- DSP和通用处理器在结构上有什么不同?
- PAT Advanced Level 1030. Travel Plan (30)(Java and C++)
- 网页自动转发提交表单功能
- C++ typedef用法小结
- 学习1-加油!
- 数据结构 第一章绪论 学习笔记
- 8、ExtJs——Ext基础架构--Ext操作DOM
- C++ 虚函数表解析
- oracle 11g r1 linux环境手工创建实例(含脚本)
- Codeforces 467C. George and Job