每日算法:Dijkstra+DFS

日期:2023.10.18

第9天

题目来源:patA1030

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 510;
const int INF = 0x3f3f3f3f;
int n, m, s, d;
int G[MAXN][MAXN];
int cost[MAXN][MAXN]; //边的第二标尺
int totalCost[MAXN] = {0}; //每个点到起点的距离 
 
bool vis[MAXN] = {0};
int dijk[MAXN];
int pre[MAXN];

void Dijkstra(int s) {
	memset(dijk, 0x3f, sizeof(dijk));
	dijk[s] = 0;
	
	//每个点的前驱结点设置为自己 
	for(int i = 0; i < n; i++) {
		pre[i] = i;
	}
	
	for(int i = 0; i < n; i++) {
		//三步走
		int u = -1, MIN = INF;
		for(int j = 0; j < n; j++) {
			if(vis[j] == 0 && dijk[j] < MIN) {
				u = j;
				MIN = dijk[j];
			}
		} 
		
		if(u == -1) return ;
		vis[u] = 1;
		
		for(int v = 0; v < n; v++) {
			if(G[u][v] != INF && vis[v] == 0) {
				if(dijk[u] + G[u][v] < dijk[v]) {
					pre[v] = u;
					dijk[v] = dijk[u] + G[u][v];
					totalCost[v] = totalCost[u] + cost[u][v]; 
				}
				else if(dijk[u] + G[u][v] == dijk[v]) {
					//根据第二标尺,决定是否更换前驱路径 
					if(totalCost[u] + cost[u][v] < totalCost[v]) {
						totalCost[v] = totalCost[u] + cost[u][v]; 
						pre[v] = u;
					}
				}
			}
		}
	} 
}

void DFS(int v) {
	if(v == s) {
		printf("%d ", v);
		return ;
	}
	else {
		DFS(pre[v]);
		printf("%d ", v);
	}
}



int main(void) {
	scanf("%d%d%d%d", &n, &m, &s, &d);
	
	memset(G, 0x3f, sizeof(G));
	
	for(int i = 0; i < m; i++) {
		int v1, v2, dis, cos;
		scanf("%d%d%d%d", &v1, &v2, &dis, &cos);
		G[v1][v2] = G[v2][v1] = dis;
		cost[v1][v2] = cost[v2][v1] = cos; 
	}
	Dijkstra(s);
	
	//输出路径 
	DFS(d);
	printf("%d %d ", dijk[d], totalCost[d]);
	
	return 0;
}

问题:

        1.把昨天的题又重新做了一遍。因为 只涉及到简单的第二标尺,可以直接在Dijkstra()里面求出第二尺度最优值。

        2.因为输出多加了个空格,报错显示格式错误,却一直以为是自己的代码又语法错误的地方。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前路漫漫亦灿灿上岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值