• A1030 Travel Plan (30分)


    一、技术总结

    1. 这一题是关于图的遍历,但是涉及Djikstra算法,在求最短路径的同时,还要把路径记录下来;同时增加了边权,也就会每个城市之间的花费;
    2. 这里采用Djikstra算法+DFS遍历的方法
    3. 第一步使用Djikstra算法求出最短路径,使用vector类型pre数组进行存储,每个结点里面保存的是他们的前驱结点。
    4. 然后再使用DFS遍历pre,然后会有得出遍历树。
    5. 要注意下标是0n-1,还是1n。
    6. 细节问题参考代码

    二、参考代码

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN = 510;
    const int INF = 100000000;
    bool vis[MAXN] = {false};
    int d[MAXN], c[MAXN];
    int G[MAXN][MAXN], cost[MAXN][MAXN];
    vector<int> pre[MAXN];
    vector<int> path, tempPath;
    int n, m, c1, c2;//求的两城市id号 
    int optValue = INF;
    void Djikstra(int s){
    	fill(d, d+MAXN, INF);
    	d[s] = 0; 
    	for(int i = 0; i < n; i++){
    		int u = -1, MIN = INF;
    		for(int j = 0; j < n; j++){
    			if(vis[j] == false && d[j] < MIN){
    				u = j;
    				MIN = d[j];
    			}
    		}
    		if(u == -1) return;
    		vis[u] = true;
    		for(int v = 0; v < n; v++){
    			if(vis[v] == false && G[u][v] != INF){
    				if(d[u] + G[u][v] < d[v]){
    					d[v] = d[u] + G[u][v];
    					pre[v].clear();
    					pre[v].push_back(u);
    				}else if(d[u] + G[u][v] == d[v]){
    					pre[v].push_back(u);
    				}
    			}
    		}
    	}
    }
    void DFS(int v){
    	if(v == c1){
    
    		tempPath.push_back(v);
    		int value = 0;
    		for(int i = tempPath.size()-1; i > 0; i--){
    			int id = tempPath[i], idNext = tempPath[i-1];
    			value += cost[id][idNext]; 
    		}
    		if(value < optValue){
    			path = tempPath;
    			optValue = value;
    		}
    		tempPath.pop_back();
    		return;
    	}
    	tempPath.push_back(v);
    	for(int i = 0; i < pre[v].size(); i++){
    		DFS(pre[v][i]);
    	}
    	tempPath.pop_back();
    }
    int main(){
    	scanf("%d%d%d%d", &n, &m, &c1, &c2);
    	int id1, id2;
    	int distance, price;
    	fill(G[0], G[0]+MAXN*MAXN, INF);
    	fill(cost[0], cost[0]+MAXN*MAXN, INF);
    	for(int i = 0; i < m; i++){
    		scanf("%d%d%d%d", &id1, &id2, &distance, &price);
    		G[id1][id2] = distance;
    		G[id2][id1] = distance;
    		cost[id1][id2] = price;
    		cost[id2][id1] = price;
    	}
    	Djikstra(c1);
    	DFS(c2);
    	for(int i = path.size()-1; i >= 0; i--){
    		printf("%d ", path[i]);
    	}
    	printf("%d %d", d[c2], optValue);
    	return 0;
    }
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    极客教学笔记---Java实现简单聊天客户端模拟
    java单例模式四模板
    关于在命令行进行文件输入输出重定向的小笔记
    Python爬虫入门之爬取图片
    Python爬虫入门之查询ip地址
    Python爬虫入门之get网页信息并作为文本输出
    Checker
    Manacher模板
    POJ3974——Palindrome
    Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/tsruixi/p/12395412.html
Copyright © 2020-2023  润新知