热浪

// 热浪.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
//http://ybt.ssoier.cn:8088/problem_show.php?pid=1379
【题目描述】
德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。
Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,
以减轻德克萨斯人忍受酷暑的痛苦。

FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,
方便地标号為1到T。除了起点和终点外的每个城镇由两条双向道路连向至少两个其它的城镇。
每条道路有一个通过费用(包括油费,过路费等等)。

给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。
条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。
求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。

【输入】
第一行: 4个由空格隔开的整数: T, C, Ts, Te;

第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci。

【输出】
一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。

【输入样例】
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
【输出样例】
7
【提示】
【样例说明】

5->6->1->4 (3 + 1 + 3)
*/



#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <queue>

using  namespace std;

typedef pair<int, int> PII;

const int N = 2510;
const int M = 6200*2 + 10;

int h[N], e[M], ne[M], w[M], idx;
int dist[N];        // 存储所有点到1号点的距离
bool st[N];     // 存储每个点的最短距离是否已确定
int start, en, n, m;

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

int spfa() {
	memset(dist, 0x3f, sizeof dist);
	dist[start] = 0;
	priority_queue<PII, vector<PII>, greater<PII>> heap;
	heap.push({ 0, start });      // first存储距离,second存储节点编号

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;

        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > distance + w[i])
            {
                dist[j] = distance + w[i];
                heap.push({ dist[j], j });
            }
        }
    }
	
    return dist[en];
}


int main()
{
    memset(h, -1, sizeof h);
	cin >> n >> m >> start >> en;
	for (int i = 1; i <= m; i++) {
		int a, b, l; cin >> a >> b >> l;
		add(a, b, l); add(b, a, l);
	}

	cout << spfa() << endl;

	return 0;
}

posted on 2025-04-09 10:50  itdef  阅读(7)  评论(0)    收藏  举报

导航