ZZULIOJ-1524-小P上考场

问题 H: 小P上考场

时间限制: 1 Sec  内存限制: 128 MB
提交: 132  解决: 31
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

小P一觉醒来发现天已经亮了。今天是程序设计大赛的日子,小P需要尽快赶往考场。 小P家在a号路口,他会告诉你哪些路口是相联通的,距离是多少。赛场在b号路口,该市道路没有单行道。 小P想让你帮他规划到考场的路线,他希望找到这条最短的路线以用最短时间抵达考场。

输入

第一行四个整数n,m,a,b (1<=n<=2500 ,1<=m<=6200 ,1<=a,b<=n ) ,n表示有n个路口,m表示有m条路,每两个路口之间连通算一条路,接下来m行,每行三个数,x,y,c代表x路口到y路口之间有一条路距离为c 

输出

一个数,小P家到比赛现场的距离。

样例输入 Copy

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

样例输出 Copy

7

提示

1<=n<=2500 

1<=m<=6200 

1<=a,b<=n 

思路

对于这种题我做的不多,加上一直在忙考研,唉(还是我太菜了,说多了都是泪).

本来我用DFS,但是超时就很难过,所以就想到用dijkstra.

这个我在这就不多说了,本人不才,就不误导,浪费你时间了,你可以百度搜搜,网上的很多教程都讲得很明白.

 

代码

#include<cstdio>
#include<queue>
#include<cstring>
#define INF 0x7f7f7f7f

using namespace std;

//struct node{
//	int x;
//	int sum;
//	node(int x,int sum):x(x),sum(sum){
//	}
//};

const int maxn = 3000;
int p[maxn][maxn];
int v[maxn];
int res[maxn];
int n,m,a,b,x,y,c;

void solve(int a){
	for (int i = 1; i <= n; i++) {
		int minn = INF;
		int minIndex;
		for (int j = 1; j <= n; j++) {
			if (v[j] == 0 && res[j] <= minn) {
				minn = res[j];
				minIndex = j;
			}
		}
		v[minIndex] = 1;
		for (int j = 1; j <= n; j++) {
			if (v[j] == 0 && res[j] > res[minIndex]+p[minIndex][j]){
				res[j] = res[minIndex] + p[minIndex][j];
			}
		}
	}
}

int main(){
	memset(p, INF, sizeof(p));
	memset(res, INF, sizeof(res));
	scanf("%d%d%d%d",&n,&m,&a,&b);
	
	for (int i = 1; i <= m; i++) {
		scanf("%d%d%d",&x,&y,&c);
		p[x][y] = c;
		p[y][x] = c;
	}

	res[a] = 0;
	solve(a);
	printf("%d\n",res[b]);
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Honyelchak

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

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

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

打赏作者

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

抵扣说明:

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

余额充值