zoukankan      html  css  js  c++  java
  • 7-36 旅游规划 (25 分(Dijkstra)

    有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

    输入格式:

    输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

    输出格式:

    在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

    输入样例:

    4 5 0 3
    0 1 1 20
    1 3 2 30
    0 3 4 10
    0 2 2 20
    2 3 1 20
    

    输出样例:

    3 40

    题解:Dijsktra求解,然后多一个当路径相等时,按价格小的来

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define INF 0x3f3f3f
    
    using namespace std;
    
    int Map[505][505];
    int Cost[505][505];
    int dis[505],MCost[505];
    bool vis[505]= {false};
    int Min;
    void Dijkstra(int v0,int v,int d) {
    	dis[v0]=0;
    	vis[v0]=true;
    	for(int i=0; i<v; i++) {
    		Min=INF;
    		for(int k=0; k<v; k++) {
    			if(!vis[k]) {
    				if(dis[k]<Min) {
    					Min=dis[k];
    					v0=k;
    				}
    			}
    		}
    		vis[v0]=true;
    		for(int k=0; k<v; k++) {
    			if(!vis[k]&&Min+Map[v0][k]<dis[k]) {
    				dis[k]=Min+Map[v0][k];
    				MCost[k]=MCost[v0]+Cost[v0][k];
    			} else if(!vis[k]&&Min+Map[v0][k]==dis[k]&&MCost[k]>MCost[v0]+Cost[v0][k]) {
    				MCost[k]=MCost[v0]+Cost[v0][k];
    			}
    		}
    	}
    }
    int main() {
    	int v,e,s,d;
    	scanf("%d %d %d %d",&v,&e,&s,&d);
    	for(int i=0; i<v; i++)
    		for(int j=0; j<v; j++) {
    			Map[i][j]=Map[j][i]=INF;
    			Cost[i][j]=Cost[j][i]=INF;
    			//设置为双向连通,并初始化为最大值
    		}
    	for(int i=0; i<e; i++) {
    		int a,b,c,d;
    		cin>>a>>b>>c>>d;
    		Map[a][b]=Map[b][a]=c;
    		Cost[a][b]=Cost[b][a]=d;
    
    	}
    	for(int i=0; i<v; i++) {
    		dis[i]=Map[i][s];//Map[i][s]为点i到起始点的距离
    		MCost[i]=Cost[i][s];
    	}
    	Dijkstra(s,v,d);
    	cout<<dis[d]<<" "<<MCost[d]<<endl;
    	return 0;
    }
    
  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/Staceyacm/p/10781881.html
Copyright © 2011-2022 走看看