数据结构基础之最短路径函数

6-1 Shortest Path [3] (8 分)

Write a program to not only find the weighted shortest distances, but also count the number of different minimum paths from any vertex to a given source vertex in a digraph. It is guaranteed that all the weights are positive.

Format of functions:

void ShortestDist( MGraph Graph, int dist[], int count[], Vertex S );

where MGraph is defined as the following:

typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;
    int Ne;
    WeightType G[MaxVertexNum][MaxVertexNum];
};
typedef PtrToGNode MGraph;

The shortest distance from V to the source S is supposed to be stored in dist[V]. If V cannot be reached from S, store -1 instead. The number of different minimum paths from V to the source S is supposed to be stored in count[V] and count[S]=1.

Sample program of judge:

#include <stdio.h>
#include <stdlib.h>

typedef enum {false, true} bool;
#define INFINITY 1000000
#define MaxVertexNum 10  /* maximum number of vertices */
typedef int Vertex;      /* vertices are numbered from 0 to MaxVertexNum-1 */
typedef int WeightType;

typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;
    int Ne;
    WeightType G[MaxVertexNum][MaxVertexNum];
};
typedef PtrToGNode MGraph;

MGraph ReadG(); /* details omitted */

void ShortestDist( MGraph Graph, int dist[], int count[], Vertex S );

int main()
{
    int dist[MaxVertexNum], count[MaxVertexNum];
    Vertex S, V;
    MGraph G = ReadG();

    scanf("%d", &S);
    ShortestDist( G, dist, count, S );

    for ( V=0; V<G->Nv; V++ )
        printf("%d ", dist[V]);
    printf("\n");
    for ( V=0; V<G->Nv; V++ )
        printf("%d ", count[V]);
    printf("\n");

    return 0;
}

/* Your function will be put here */

Sample Input (for the graph shown in the figure):

在这里插入图片描述

8 11
0 4 5
0 7 10
1 7 30
3 0 40
3 1 20
3 2 100
3 7 70
4 7 5
6 2 1
7 5 3
7 2 50
3

Sample Output:

40 20 100 0 45 53 -1 50 
1 1 4 1 1 3 0 3 

Solution:

void ShortestDist(MGraph Graph,int dist[],int count[],Vertex S)
{
	int i,min,b; 
    int a[1000];
    for(i=0;i<MaxVertexNum;i++) 
	{
	count[i]=0;
	a[i]=0;
    dist[i]=100000;
	}
	
	count[S]=1;
	dist[S]=0;
 
    while(1)
    {
        min=100000;
		b=-1;
        for(i=0;i<Graph->Nv;i++)
        {
          if (a[i]==0)
		    	if(dist[i]<min)
                {
                min=dist[i];
				b=i;
				}
    	} 
		a[b]=1;
 		if(b<0) break;
        
		for(i=0;i<Graph->Nv;i++)
        {
        	if (a[i]==0)
        	{ 
				if(dist[i]==Graph->G[b][i]+min) 
				{
				count[i]=count[i]+count[b];
        		}	
            else if(dist[i]>Graph->G[b][i]+min)
                {
                dist[i]=Graph->G[b][i]+min;
				count[i]=count[b];
    			}
		}
    }
    }
    
	
	for(i=0;i<MaxVertexNum;i++)
        if(dist[i]==100000) 
		{
		dist[i]=-1;
		count[i]=0;
		}		
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最短路径问题是图论中的经典问题,常用的算法有Dijkstra算法和Bellman-Ford算法。其中,Dijkstra算法适用于图上没有负权边的情况。下面是两种输出最短路径的方法: 1. 用Dijkstra算法输出最短路径 Dijkstra算法是一种用于求加权图中单个源点到其他所有顶点的最短路径的贪心算法。具体步骤如下: - 初始化:将源点s的路径长度dist[s]设为0,其他所有路径长度dist[v]设为无穷大。 - 重复执行以下步骤,直到所有顶点的最短路径都求出来: - 在未确定最短路径的顶点中,选取距离源点s最近的顶点u,标记顶点u的最短路径为确定的。 - 对于顶点u的每个邻接点v,如果当前路径长度加上u到v边的权值小于起始点到v的路径长度,就更新起始点到v的路径长度dist[v]。 - 最后,dist数组中的值即为源点到其他所有顶点的最短路径长度。 下面是一个使用Dijkstra算法输出最短路径的Python代码实现: ```python import heapq def dijkstra(graph, start): heap = [(0, start)] visited = set() dist = {start: 0} while heap: (cost, u) = heapq.heappop(heap) if u in visited: continue visited.add(u) for v, weight in graph[u].items(): new_cost = dist[u] + weight if v not in dist or new_cost < dist[v]: dist[v] = new_cost heapq.heappush(heap, (new_cost, v)) return dist graph = { 'A': {'B': 2, 'C': 3}, 'B': {'A': 2, 'C': 4, 'D': 1}, 'C': {'A': 3, 'B': 4, 'D': 2}, 'D': {'B': 1, 'C': 2} } distances = dijkstra(graph, 'A') print(distances) # 输出:{'A': 0, 'B': 2, 'C': 3, 'D': 3} ``` 上述代码中,我们实现了一个dijkstra函数,用于计算从指定起点到其他点的最短路径。 2. 使用谷歌地图API输出最短路径 谷歌地图提供了API,可以用于绘制两个点之间的最短路径。具体步骤如下: - 获取谷歌地图API密钥。 - 根据谷歌地图API文档中的要求,构造请求URL,其中包含初始位置和目标位置的经纬度坐标。 - 发送HTTP请求,并解析返回结果中的路径坐标点。 - 将路径坐标点绘制在谷歌地图上。 下面是一个使用谷歌地图API输出最短路径的Python代码实现: ```python import requests import json def get_directions(origin, destination, api_key): url = ('https://maps.googleapis.com/maps/api/directions/json?' 'origin={0}&destination={1}&key={2}').format(origin, destination, api_key) response = requests.get(url) json_data = json.loads(response.text) polyline = json_data['routes']['overview_polyline']['points'] return polyline # 例子 api_key = 'your_api_key' origin = 'Toronto' destination = 'Montreal' path = get_directions(origin, destination, api_key) ``` 上述代码中,我们使用requests库向谷歌地图API请求路径信息,并使用json库解析API返回结果中的路径坐标点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值