2017年提高组Day1T3 逛公园题解

本文是2017年全国信息学奥林匹克竞赛(NOIP)Day1第三题的题解,主要探讨如何使用链式前向星存图、Dijkstra算法求最短路径,并通过动态规划(DP)求解问题,同时介绍剪枝优化算法来避免冗余计算,解决TLE问题。
摘要由CSDN通过智能技术生成

最近开始复习NOIP2019,又刷了一遍前几年的题,感触很深,2017年Day1T3绝对是一道好题,考察的方面非常得广,值得发篇题解供大家参考一下。

题目链接(洛谷)

PART1(输入——存图):

个人比较喜欢链式前向星的存图方法,非常简便,不多说了,上代码:

struct Edge {
   
	int u, v, w, next;
};
Edge e[maxm * 2];

void addEdge(int u, int v, int w) {
   
	en ++;
	e[en].v = v;
	e[en].w = w;
	e[en].next = head[u];
	head[u] = en;
}

int main() {
    
	int t;
	en = 0;
	
	cin >> t;
	while (t--) {
   
		
		en = 0;
		cin >> n >> m >> K >> p;
		for (int i = 1; i <= n; ++i) head[i] = 0;
		
		for (int i = 1; i <= m; ++i) {
   
			int u, v, w;
			cin >> u >> v >> w;
			
			addEdge(u, v, w);
		}
	}
	
	return 0;
}

Part2(求最短路径):

分析一下这道题,明显要求一遍最短路径,而且最好把从1开始到每个点的最短路径存下来,备之后只用。笔者用的是dijsktra算法+堆优化,是最短路径求法中较快的,也是十分稳定的一种算法(SPFA容易被卡常数)也非常常规:

typedef pair<int,int> state;

void dijkstra(int s) {
   
	
	for (int i = 1; i <= n; ++i) vs[i] = false;
	for (int i = 1; i <= n; ++i) d[i] = INT_MAX;
	
	d[s] = 0;
	priority_queue<state, vector<state>, greater<state> > q;
	
	q.push(make_pair(0, s));
	
	while (!q.empty()) {
   
		state k = q.top();
		q.pop();
		if (vs[k.second]) continue;
		vs[k.second] = true;
		
		int u = k.second;
		for (int num = head[u]; num != 0; num = e[num
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值