AcWing 1127. 香甜的黄油

要点:

  1. 计算复杂度,对 n 个点做spfa,不会超时
  2. 不能用邻接矩阵,会超时
  3. 循环队列的写法
int q[N], hh = 0, tt = 1;
q[0] = x;

while (hh != tt) {
    int t = q[hh ++ ];
    if (hh == N) hh = 0;
    ...
    q[tt ++ ] = f(t);
    if (tt == N) tt = 0;
}
  1. 永远要记得各个初始化:h, dist
// Problem: 香甜的黄油
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/1129/
// Memory Limit: 64 MB
// Time Limit: 1000 ms

#include<iostream>
#include<algorithm>
#include<cstring>	// memset
#define x first
#define y second

using namespace std;
typedef pair<int, int> PII;

const int N = 810, M = 2910, INF = 0x3f3f3f3f;

int cow, n, m, idx, id[N];
int dist[N], e[M], ne[M], w[M], h[N];
bool st[N];

void add(int a, int b, int c){
	e[idx] = b;
	ne[idx] = h[a];
	w[idx] = c;
	h[a] = idx ++ ;
}

int spfa(int sx) {
	int q[N], hh = 0, tt = 1;
	memset(dist, 0x3f, sizeof dist);
	q[0] = sx;
	dist[sx] = 0;
	st[sx] = true;
	
	while (hh != tt) {
		int t = q[hh ++ ];
		if (hh == N) hh = 0;
		st[t] = false;
		
		for (int i = h[t]; ~i; i = ne[i]) {
			int j = e[i];
			if (dist[j] > dist[t] + w[i]) {
				dist[j] = dist[t] + w[i];
				if (!st[j]) {
					q[tt ++ ] = j;
					if (tt == N) tt = 0;
					st[j] = true;
				}
			}
		}
	}
	
	int res = 0;
	for (int i = 0; i < cow; i ++ ) {
		if (dist[id[i]] == INF) return INF;
		res += dist[id[i]];
	}
	return res;	
}

int main(void) {
	cin >> cow >> n >> m;
	for(int i = 0; i < cow; i ++ ) cin >> id[i];
	memset(h, -1, sizeof h);
	while (m -- ) {
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c), add(b, a, c);
	}
	
	int res = INF;
	for (int i = 1; i <= n; i ++ ) res = min(res, spfa(i));
	cout << res << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值