旅游规划。

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define ERROR -1
#define MaxVex 501
#define INF 0x3f3f3f3f
int Map[MaxVex][MaxVex];
int cost[MaxVex][MaxVex];
int Nv,Ne;
int visit[MaxVex]= {0};
int dist[MaxVex];
int Mcost[MaxVex];
void Init() {
	memset(Map,INF,sizeof(Map));
	memset(cost,0,sizeof(cost));
	int i;
	int v1,v2,p,c;
	for(i=0; i<Ne; i++) {
		scanf("%d %d %d %d",&v1,&v2,&p,&c);
		Map[v1][v2]=p;
		Map[v2][v1]=Map[v1][v2];
		cost[v1][v2]=c;
		cost[v2][v1]=cost[v1][v2];
	}
}
void D(int s) {
	visit[s]=1;
	int i,j,w;
	//加上这个好一点
	for(i=0;i<Nv;i++)
	{
		dist[i]=Map[s][i];
	}
	for(j=0; j<Nv; j++)
	{
		int MIN=INF;
		//min
		for(i=0; i<=Nv; i++) {
			if(!visit[i]) {
				if(dist[i]<MIN) {
					MIN=dist[i];
					w=i;
				}
			}
		}
		visit[w]=1;
		//更新邻接点,不再是无穷大
		for(i=0; i<=Nv; i++) {
			if(!visit[i]) {
				if(MIN+Map[w][i]<dist[i]) {
					dist[i]=MIN+Map[w][i];
					Mcost[i]=Mcost[w]+cost[w][i];
				} else if(MIN+Map[w][i]==dist[i]) {
					if(Mcost[i]>Mcost[w]+cost[w][i]) {
						Mcost[i]=Mcost[w]+cost[w][i];
					}
				}
			}
		}
	}
}
int main() {
	int s,d;
	scanf("%d %d %d %d",&Nv,&Ne,&s,&d);
	int i;
	for(i=0; i<Nv; i++) {
		visit[i]=0;
	}
	Init();
	for(i=0; i<Nv; i++) {
		dist[i]=Map[s][i];
		Mcost[i]=cost[s][i];
	}
	D(s);
	printf("%d %d",dist[d],Mcost[d]);
	return 0;
}

​​​​​​​

#include<stdio.h>
#include<stdlib.h>
typedef enum { false, true }bool;
#define MAX 500
#define INFINITY 65535
#define ERROR -1
typedef int Vertex;
typedef int WeightType;
typedef struct ENode *PtrToENode;
struct ENode{
	Vertex V1,V2;
	WeightType Dist,Cost;
};
typedef PtrToENode  Edge;
typedef struct GNode *PtrToGNode;
struct GNode{
	int Nv;
	int Ne;
	WeightType Dist[MAX][MAX];
	WeightType Cost[MAX][MAX];
	Vertex S,D;
};
typedef PtrToGNode MGraph;
MGraph CreateGraph(int Nv);
void InsertEdge(MGraph Graph,Edge E);
MGraph BuildGraph();
Vertex FindMinDist(MGraph Graph,int dist[],int collected[]);
void Dijkstra(MGraph Graph,int dist[],int cost[],Vertex S);
int main()
{
	int *dist,*cost;
	MGraph Graph=BuildGraph();
	dist=(int*)malloc(sizeof(int)*Graph->Nv);
	cost=(int*)malloc(sizeof(int)*Graph->Nv);
	Dijkstra(Graph,dist,cost,Graph->S);
	printf("%d %d\n",dist[Graph->D],cost[Graph->D]);
	
	return 0;
}
MGraph CreateGraph(int Nv)
{
	Vertex V,W;
	MGraph Graph;
	Graph=(MGraph)malloc(sizeof(struct GNode));
	Graph->Nv=Nv;
	Graph->Ne=0;
	for(V=0;V<Graph->Nv;V++)
		for(W=0;Graph->Nv;W++)
			Graph->Dist[V][W]=Graph->Cost[V][W]=INFINITY;
	return Graph;
}
void InsertEdge(MGraph Graph,Edge E)
{
	Graph->Dist[E->V1][E->V2]=E->Dist;
	Graph->Cost[E->V1][E->V2]=E->Cost;
	
	Graph->Dist[E->V2][E->V1]=E->Dist;
	Graph->Cost[E->V2][E->V1]=E->Cost;
}
MGraph BuildGraph()
{
	MGraph Graph;
	Edge E;
	Vertex V;
	int Nv,i;
	scanf("%d",&Nv);
	Graph=CreateGraph(Nv);
	scanf("%d",&(Graph->Ne));
	scanf("%d %d",&(Graph->S),&(Graph->D));
	if(Graph->Ne!=0){
		E=(Edge)malloc(sizeof(struct ENode));
		for(i=0;i<Graph->Ne;i++)
		{
			scanf("%d %d %d %d",&E->V1,&E->V2,&E->Dist,&E->Cost);
			InsertEdge(Graph,E);
		}
	}
	return Graph;
}
Vertex FindMinDist(MGraph Graph,int dist[],int collected[])
{
	Vertex MinV,V;
	int MinDist=INFINITY;
	for(V=0;V<Graph->Nv;V++)
	{
		if(collected[V]==false&&dist[V]<MinDist)
		{
			MinDist=dist[V];
			MinV=V;
		}
	}
	if(MinDist<INFINITY)
		return MinV;
	else return ERROR;
}
void Dijkstra(MGraph Graph,int dist[],int cost[],Vertex S)
{
	int collected[MAX];
	Vertex V,W;
	//初始化
	for(V=0;V<Graph->Nv;V++)
	{
		dist[V]=Graph->Dist[S][V];
		cost[V]=Graph->Cost[S][V];
		collected[V]=false;
	}
	dist[S]=cost[S]=0;
	collected[S]=true;
	while(1){
		//TODO
		V=FindMinDist(Graph,dist,collected);
		if(V==ERROR) break;
		collected[V]=true;
		for(W=0;W<Graph->Nv;W++)
		{
			if(collected[W]==false&&Graph->Dist[V][W]<INFINITY)
			{
				if(dist[V]+Graph->Dist[V][W]<dist[W]){
					dist[W]=dist[V]+Graph->Dist[V][W];
					cost[W]=cost[V]+Graph->Cost[V][W];
				}
				else if(dist[V]+Graph->Dist[V][W]==dist[W]&&cost[V]+Graph->Cost[V][W]<cost[W])
				{
					cost[W]=cost[V]+Graph->Cost[V][W];
				}
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值