当前位置:网站首页>P3008 [USACO11JAN]Roads and Planes G (SPFA + SLF优化)
P3008 [USACO11JAN]Roads and Planes G (SPFA + SLF优化)
2022-07-02 10:14:00 【Joanh_Lan】
题目如下:
[USACO11JAN]Roads and Planes G
题面翻译
题面描述
Farmer John 正在一个新的销售区域对他的牛奶销售方案进行调查。他想把牛奶送到 T T T 个城镇 ( 1 ≤ T ≤ 25 , 000 1 \le T \le 25,000 1≤T≤25,000 ),编号为 1 1 1 到 T T T 。这些城镇之间通过 R R R 条道路 ( 1 ≤ R ≤ 50 , 000 1 \le R \le 50,000 1≤R≤50,000 ,编号为 1 1 1 到 R R R ) 和 P P P 条航线 ( 1 ≤ P ≤ 50 , 000 1 \le P \le 50,000 1≤P≤50,000 ,编号为 1 1 1 到 P P P ) 连接。每条道路 i i i 或者航线 i i i 连接城镇 A i A_i Ai ( 1 ≤ A i ≤ T 1 \le A_i \le T 1≤Ai≤T )到 B i B_i Bi ( 1 ≤ B i ≤ T 1 \le B_i \le T 1≤Bi≤T ),花费为 C i C_i Ci 。
对于道路 0 ≤ C i ≤ 10 , 000 0 \le C_i \le 10,000 0≤Ci≤10,000 ;然而航线的花费很神奇,花费 C i C_i Ci 可能是负数( − 10 , 000 ≤ C i ≤ 10 , 000 -10,000 \le C_i \le 10,000 −10,000≤Ci≤10,000 )。道路是双向的,可以从 A i A_i Ai 到 B i B_i Bi,也可以从 B i B_i Bi 到 A i A_i Ai ,花费都是 C i C_i Ci 。然而航线与之不同,只可以从 A i A_i Ai 到 B i B_i Bi 。
事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台 了一些政策保证:如果有一条航线可以从 A i A_i Ai 到 B i B_i Bi,那么保证不可能通过一些道路和航线从 B i B_i Bi 回到 A i A_i Ai 。由于 F J FJ FJ 的奶牛世界公认十分给力,他需要运送奶牛到每一个城镇。他想找到从发送中心城镇 S S S ( 1 ≤ S ≤ T 1 \le S \le T 1≤S≤T) 把奶牛送到每个城镇的最便宜的方案,或者知道这是不可能的。
输入格式
共 R + P + 1 R+P+1 R+P+1 行
第 1 1 1 行:四个整数 T T T , R R R , P P P 和 S S S ,分别表示城镇的数量,道路的数量,航线的数量和中心城镇。
第 2 2 2 到 R + 1 R+1 R+1 行:每行三个整数 A i A_i Ai , B i B_i Bi 和 C i C_i Ci ,描述一条道路。
第 R + 2 R+2 R+2 到 R + P + 1 R+P+1 R+P+1 行:每行三个整数 A i A_i Ai , B i B_i Bi 和 C i C_i Ci ,描述一条航线。
输出格式
共 T T T 行,第 i i i 行输出城市 S S S 到城市 i i i 的最小花费。如果不能到达,输出NO PATH
题目描述
Farmer John is conducting research for a new milk contract in a new territory. He intends to distribute milk to T (1 <= T <= 25,000) towns conveniently numbered 1…T which are connected by up to R (1 <= R <= 50,000) roads conveniently numbered 1…R and/or P (1 <= P <= 50,000) airplane flights conveniently numbered 1…P.
Either road i or plane i connects town A_i (1 <= A_i <= T) to town B_i (1 <= B_i <= T) with traversal cost C_i. For roads, 0 <= C_i <= 10,000; however, due to the strange finances of the airlines, the cost for planes can be quite negative (-10,000 <= C_i <= 10,000).
Roads are bidirectional and can be traversed from A_i to B_i or B_i to A_i for the same cost; the cost of a road must be non-negative.
Planes, however, can only be used in the direction from A_i to B_i specified in the input. In fact, if there is a plane from A_i to B_i it is guaranteed that there is no way to return from B_i to A_i with any sequence of roads and planes due to recent antiterror regulation.
Farmer John is known around the world as the source of the world’s finest dairy cows. He has in fact received orders for his cows from every single town. He therefore wants to find the cheapest price for delivery to each town from his distribution center in town S (1 <= S <= T) or to know that it is not possible if this is the case.
MEMORY LIMIT: 64MB
输入格式
* Line 1: Four space separated integers: T, R, P, and S
* Lines 2…R+1: Three space separated integers describing a road: A_i, B_i and C_i
* Lines R+2…R+P+1: Three space separated integers describing a plane: A_i, B_i and C_i
输出格式
* Lines 1…T: The minimum cost to get from town S to town i, or ‘NO PATH’ if this is not possible
样例 #1
样例输入 #1
6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
样例输出 #1
NO PATH
NO PATH
5
0
-95
-100
提示
6 towns. There are roads between town 1 and town 2, town 3 and town 4, and town 5 and town 6 with costs 5, 5 and 10; there are planes from town 3 to town 5, from town 4 to town 6, and from town 1 to town 3 with costs -100, - 100 and -10. FJ is based in town 4.
FJ’s cows begin at town 4, and can get to town 3 on the road. They can get to towns 5 and 6 using planes from towns 3 and 4. However, there is no way to get to towns 1 and 2, since they cannot go
backwards on the plane from 1 to 3.
思路:
存在负权的最短路
SPFA + SLF 可以卡过去!
SPFA + SLF 板子如下:
void SPFA()
{
deque<ll > q;
d[s] = 0;
q.push_back(s);
vis[s] = 1;
while(!q.empty())
{
ll x = q.front();
q.pop_front();
vis[x] = 0;
for(int i=head[x]; i!=-1; i = nxt[i])
{
ll v = pnt[i];
if(d[v] > d[x] + cost[i] )
{
d[v] = d[x] + cost[i] ;
if(vis[v]) continue;
vis[v] = 1;
if(q.size()&&d[v]<d[q.front()]) //SLF,小的进队头,大的到队尾
q.push_front(v);
else
q.push_back(v);
}
}
}
}
AC代码如下:
#include <bits/stdc++.h>
#define buff \ ios::sync_with_stdio(false); \ cin.tie(0);
//#define int long long
using namespace std;
const int N = 1e6 + 9;
int n, m1, m2, gog;
int h[N], e[N], ne[N], w[N], idx;
int dist[N];
bool vis[N];
void add(int a, int b, int c)
{
idx++;
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx;
}
void spfa(int goal)
{
deque<int> q;
for (int i = 1; i <= n; i++)
dist[i] = 0x3f3f3f3f, vis[i] = 0;
q.push_back(gog);
dist[gog] = 0, vis[gog] = 1;
while (!q.empty())
{
int t = q.front();
q.pop_front();
vis[t] = 0;
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 (vis[j])
continue;
vis[j] = 1;
if (q.size() && dist[j] < dist[q.front()])
q.push_front(j);
else
q.push_back(j);
}
}
}
}
void solve()
{
cin >> n >> m1 >> m2 >> gog;
int u, v, w;
for (int i = 1; i <= m1; i++)
{
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
for (int i = 1; i <= m2; i++)
{
cin >> u >> v >> w;
add(u, v, w);
}
spfa(gog);
for (int i = 1; i <= n; i++)
{
if (dist[i] == 0x3f3f3f3f)
// puts("NO PATH");
cout << "NO PATH" << '\n';
else
cout << dist[i] << '\n';
}
}
int main()
{
buff;
solve();
}
边栏推荐
- Unity skframework framework (XVI), package manager development kit Manager
- How much do you know about free SSL certificates? The difference between free SSL certificate and charged SSL certificate
- Research shows that "congenial" is more likely to become friends
- Gee learning notes 2
- 【笔耕不辍勋章活动】生命不止,写作不息
- Integral link, inertia link and proportion link in Simulink
- PR usage skills, how to use PR to watermark?
- Clean up system cache and free memory under Linux
- [OpenGL] notes 29. Advanced lighting (specular highlights)
- 量子三体问题: Landau Fall
猜你喜欢

解答:EasyDSS视频点播时音频是否可以设置为默认开启?

Gee learning notes 2

大家信夫一站式信用平台让信用场景“用起来

(POJ - 1984) navigation nightare (weighted and search set)

PR usage skills, how to use PR to watermark?

rxjs Observable 自定义 Operator 的开发技巧

能自动更新的万能周报模板,有手就会用!

Unity skframework framework (XVIII), roamcameracontroller roaming perspective camera control script

EasyDSS点播服务分享时间出错如何修改?

What are eNB, EPC and PGW?
随机推荐
A better database client management tool than Navicat
Winter vacation daily question - lucky numbers in the matrix
ArrayList and LinkedList
Unity skframework framework (XVII), freecameracontroller God view / free view camera control script
Why is the default of switch followed by break?
Daily practice of C language --- monkeys divide peaches
Nohup command
【蓝桥杯选拔赛真题43】Scratch航天飞行 少儿编程scratch蓝桥杯选拔赛真题讲解
解答:EasyDSS视频点播时音频是否可以设置为默认开启?
【OpenGL】笔记二十九、高级光照(镜面高光)
Operation tutorial: how does easydss convert MP4 on demand files into RTSP video streams?
基于ssm+jsp框架实现的学生选课信息管理系统【源码+数据库】
Explanation: here is your UFO, Goldbach conjecture
How much do you know about free SSL certificates? The difference between free SSL certificate and charged SSL certificate
Crowncad (crown CAD), the first fully independent 3D CAD platform based on Cloud Architecture in China
中文姓名提取(玩具代码——准头太小,权当玩闹)
伙伴云表格强势升级!Pro版,更非凡!
Drawing Nyquist diagram with MATLAB
[true topic of the Blue Bridge Cup trials 43] scratch space flight children's programming explanation of the true topic of the Blue Bridge Cup trials
EasyDSS点播服务分享时间出错如何修改?