PAT A1131 Subway Map (30分)【DFS求最短路径】⭐⭐⭐⭐⭐

题目描述

1131 Subway Map (30分)
给一张map,求map中某点到某点的最短距离。

知识点

图的DFS

我的实现

码前思考

我第一次写的时候用的是Dijkstra,结果超时了,所以一直都没改正。

这一次写的时候参考了柳神的代码,使用了DFS的方式来求解问题。很奇怪的是,DFS这么暴力的方法,居然也可以做到不超时,实在是令人匪夷所思!!!
在这里插入图片描述

代码实现

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;

vector<vector<int>> v(10000);
int visit[10000],minCnt,minTransfer,start,end1;
unordered_map<int,int> line;
vector<int> path,tempPath;

//用于求解换站的次数 
int transferCnt(vector<int> a){
	int cnt=-1,preLine=0;
	for(int i=1;i<a.size();i++){
		if(line[a[i-1]*10000+a[i]] != preLine) cnt++;
		preLine = line[a[i-1]*10000+a[i]];
	}
	return cnt;
} 

//用于暴力求解到达终点的路径 
void dfs(int node,int cnt){
	if(node==end1&&(cnt<minCnt||(cnt==minCnt&&transferCnt(tempPath)<minTransfer))){
		minCnt=cnt;
		minTransfer=transferCnt(tempPath);
		path=tempPath;
	}
	if(node==end1) return;
	for(int i=0;i<v[node].size();i++){
		if(visit[v[node][i]]==0){
			visit[v[node][i]]=1;//目的是为了不构成环路! 
			tempPath.push_back(v[node][i]);
			dfs(v[node][i],cnt+1);
			visit[v[node][i]]=0;
			tempPath.pop_back();
		}
	}
}

int main(){
	int n,m,k,pre,temp;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d%d",&m,&pre);
		for(int j=1;j<m;j++){
			scanf("%d",&temp);
			v[pre].push_back(temp);
			v[temp].push_back(pre);
			line[pre*10000+temp] = line[temp*10000+pre] = i+1;
			pre=temp;
		}
	}
	scanf("%d",&k);
	for(int i=0;i<k;i++){
		scanf("%d%d",&start,&end1);
		minCnt=99999,minTransfer=99999;
		tempPath.clear();
		tempPath.push_back(start);
		visit[start]=1;
		dfs(start,0);
		visit[start]=0;
		printf("%d\n",minCnt);
		int preLine=0,preTransfer=start;
		for(int j=1;j<path.size();j++){
			if(line[path[j-1]*10000+path[j]] != preLine){
				if(preLine!=0) printf("Take Line#%d from %04d to %04d.\n",preLine,preTransfer,path[j-1]);
				preLine = line[path[j-1]*10000+path[j]];
				preTransfer = path[j-1];
			} 
		}
		printf("Take Line#%d from %04d to %04d.\n", preLine, preTransfer, end1);
	}	
	return 0;
} 

码后反思

(ง •_•)ง这道题目我是抄的代码,自己其实没有手动敲。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
地铁线路最短路径可以使用Dijkstra算法来解决。以下是Java实现的示例代码: ```java import java.util.*; public class Subway { private static final int INF = Integer.MAX_VALUE; // 代表正无穷 private int[][] graph; // 地铁图的邻接矩阵表示 private int[] dist; // 起点到各个站点的最短距离 private boolean[] visited; // 标记站点是否已经访问过 private int start; // 起点站 public Subway(int[][] graph, int start) { this.graph = graph; this.start = start; this.dist = new int[graph.length]; this.visited = new boolean[graph.length]; } public void shortestPath() { Arrays.fill(dist, INF); dist[start] = 0; for (int i = 0; i < graph.length; i++) { // 找到未访问过的距离起点最近的站点 int u = -1; int minDist = INF; for (int j = 0; j < graph.length; j++) { if (!visited[j] && dist[j] < minDist) { u = j; minDist = dist[j]; } } if (u == -1) break; // 如果找不到未访问过的站点,则退出循环 visited[u] = true; // 更新与u相邻的站点到起点的最短距离 for (int v = 0; v < graph.length; v++) { if (!visited[v] && graph[u][v] != INF) { dist[v] = Math.min(dist[v], dist[u] + graph[u][v]); } } } } public int getShortestDist(int end) { return dist[end]; } public static void main(String[] args) { int[][] graph = new int[][]{ {0, 3, 1, 2, INF}, {3, 0, INF, INF, 4}, {1, INF, 0, INF, INF}, {2, INF, INF, 0, 5}, {INF, 4, INF, 5, 0} }; Subway subway = new Subway(graph, 0); subway.shortestPath(); System.out.println(subway.getShortestDist(4)); // 输出起点到终点的最短距离 } } ``` 在这个示例代码中,我们用邻接矩阵表示地铁图,用Dijkstra算法出起点到各个站点的最短距离。可以通过调用`getShortestDist`方法来获取起点到某个站点的最短距离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值