列表

详情


NC24852. [USACO 2009 Oct G]Heat Wave

描述

The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for good eating but are not so adept at creating creamy delicious dairy products. Farmer John is leading the charge to deliver plenty of ice cold nutritious milk to Texas so the Texans will not suffer the heat too much. FJ has studied the routes that can be used to move milk from Wisconsin to Texas. These routes have a total of T (1 <= T <= 2,500) towns conveniently numbered 1..T along the way (including the starting and ending towns). Each town (except the source and destination towns) is connected to at least two other towns by bidirectional roads that have some cost of traversal (owing to gasoline consumption, tolls, etc.). Consider this map of seven towns; town 5 is the source of the milk and town 4 is its destination (bracketed integers represent costs to traverse the route):                               [1]----1---[3]-                              /               \                       [3]---6---[4]---3--[3]--4                      /               /       /|                     5         --[3]--  --[2]- |                      \       /        /       |                       [5]---7---[2]--2---[3]---                             |       /                            [1]------ Traversing 5-6-3-4 requires spending 3 (5->6) + 4 (6->3) + 3 (3->4) = 10 total expenses. Given a map of all the C (1 <= C <= 6,200) connections (described as two endpoints R1i and R2i (1 <= R1i <= T; 1 <= R2i <= T) and costs (1 <= Ci <= 1,000), find the smallest total expense to traverse from the starting town Ts (1 <= Ts <= T) to the destination town Te (1 <= Te <= T).
POINTS: 300

输入描述

* Line 1: Four space-separated integers: T, C, Ts, and Te
* Lines 2..C+1: Line i+1 describes road i with three space-separated integers: R1i, R2i, and Ci

输出描述

* Line 1: A single integer that is the length of the shortest route from Ts to Te. It is guaranteed that at least one route exists.

示例1

输入:

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)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 15ms, 内存消耗: 616K, 提交时间: 2020-02-05 20:23:34

#include<bits/stdc++.h>
using namespace std;
int t,c,ts,te,d[2505],dis[2505];
struct node{
	int v,w;
	node(){
	}
	node(int a,int b){
		v = a;
		w = b;
	}
};
vector<node> E[2505];
priority_queue<pair<int,int> > q;
void dijkstra(int s,int t){
	memset(d,0x3f,sizeof d);
	d[s] =0;
	q.push(make_pair(0,s));
	while(!q.empty()){
		int x = q.top().second;
		q.pop();
		if(dis[x]) continue;
		dis[x] =1;
		for(auto i: E[x]){
			int y =i.v,z=i.w;
			if(d[y] > d[x] +z){
				d[y] =d[x] +z;
				q.push(make_pair(-d[y],y));
			}
		}
	}
}
int main(){
	cin >>t >> c >> ts >> te;
	while(c--){
		int u,v,w;
		cin >> u >> v >> w;
		E[u].push_back(node(v,w));
		E[v].push_back(node(u,w));
	}
	dijkstra(ts,te);
	cout<<d[te]<<endl;
	return 0;
} 

C++(g++ 7.5.0) 解法, 执行用时: 48ms, 内存消耗: 25128K, 提交时间: 2022-11-25 21:02:51

#include<bits/stdc++.h>
using namespace std;
const int N = 2507;
#define per(i,a,b) for(int i=a;i<=b;i++)
#define rep(i,a,b) for(int i=a;i>=b;i--)
int vis[N],s[N][N],dis[N];
int cnt,t,a,b;
void djs()
{
	memset(dis,0x3f3f3f3f,sizeof dis);
	dis[a]=0;
	per(i,1,cnt)
	{
		int t=-1;
		per(j,1,cnt)
		{
			if((t==-1||dis[j]<dis[t])&&!vis[j])
			{
				t=j;
			}
		}
		vis[t]=1;
		per(j,1,cnt)
		{
			dis[j]=min(dis[j],dis[t]+s[t][j]);
		}
	}
}
int main()
{
	memset(s,0x3f3f3f3f,sizeof s);
	cin>>cnt>>t>>a>>b;
	while(t--)
	{
		int x,y,z;
		cin>>x>>y>>z;
		s[x][y]=s[y][x]=z;
	}
	djs();
	cout<<dis[b];
	return 0;
}

C++ 解法, 执行用时: 26ms, 内存消耗: 484K, 提交时间: 2022-01-16 18:47:11

#include<bits/stdc++.h>
using namespace std;
int s[6201],e[6201],w[6201],dis[2501];
int main(){
	int t,c,ts,te,i,j;
	cin>>t>>c>>ts>>te;
	for (i = 1;i <= t;i++)
		dis[i] = 0x3fffffff;
	dis[ts] = 0;
	for (i = 1;i <= c;i++)
		cin>>s[i]>>e[i]>>w[i];
	for (i = 1;i < t;i++)
		for (j = 1;j <= c;j++){
			dis[s[j]] = min(dis[s[j]],dis[e[j]] + w[j]);
			dis[e[j]] = min(dis[e[j]],dis[s[j]] + w[j]);
		}
	cout<<dis[te];
	return 0;
}

上一题