I
N
C
A
R
D
S
−
I
n
v
i
t
a
t
i
o
n
C
a
r
d
s
INCARDS\ -\ Invitation\ Cards
INCARDS − Invitation Cards
题目链接:
l
u
o
g
u
S
P
50
luogu\ SP50
luogu SP50
题目翻译
题干: 在“电视时代”,并不是所有人都会来看剧院或者电影院的演出(他们更喜欢对着电视当一只肥宅?)。演员们意识到了这个问题。他们希望剧院发展壮大,更重要的是让演员们发展得更好。他们印刷了传单,上面有所有和这个行动(或者说项目)的重要的相关信息。他们雇了很多很多的学生来散发这些传单(当然,说好听点就是邀请卡)。每一个学生都负责一个公交车站。他们会在那里待上一整天,并且把传单发给所有坐公交车的人。所有的学生都会学习如何说服、影响他人并且不会强迫别人。 这个地方的交通系统非常神奇——所有的线路都是单向的并且连接两个车站。每半个小时,就会有一辆载有乘客的公交车从起点站出发。到达终点站之后,所有的公交车都会在空车的状态下返回那个等待了半个小时的车站,并且继续出发,例如从
X
:
00
X:00
X:00 到
X
:
30
X:30
X:30 ,其中
X
X
X 表示时间的小时部分。在两个车站之间来往的车票票价会在表格中给出,并且可以在并且可以在车站支付。交通路线经过精心设计,使得每一个环路(即起点和重点相同的路线)都会经过一个检查点(CCS),所有的乘客都必须在这里接受包括身体扫描在内的安全检查。 所有的ACM的学生志愿者们每天早上从CCS出发,所有人都会去到一个预先确定好的公交车站散发传单,车站数量和学生数量相等。每天晚上,所有的学生坐车回到CCS。你的任务是:编写一个程序,帮助ACM计算所有学生的交通费总和的最小值。 输入格式: 数据的第一行包含一个整数
N
N
N ,代表数据的组数。接下来的每一组数据,第一行包含两个整数
P
P
P 和
Q
Q
Q ,
1
≤
P
,
Q
≤
1000000
1\!≤\!P,Q\!≤\!1000000
1≤P,Q≤1000000 。
P
P
P 是包含CCS的线路数量,
Q
Q
Q 是公交线路的总数。接下来有
Q
Q
Q 行,每一行都包含三个整数,表示一条公交线路。其中,第一个整数表示起始站,第二个整数表示终点站,第三个整数表示这条公交线路的票价。CCS的代表数字是
1
1
1 。所有线路的票价都是一个正整数并且它们的总和小于
1000000000
1000000000
1000000000 。数据保证任意两个车站之间有至少一条路线可以互相到达。 输出格式: 对于每一组数据,输出一行表示所有学生的交通费总和的最小值。 说明: 输入、输出数据可能会非常多或者非常大,使用某些语言的小伙伴们要注意啦~
样例输入
2
2 2
1 2 13
2 1 33
4 6
1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50
样例输出
46
210
思路
这道题其实就是请柬,一道最短路。
唯一区别就是这道题有多组数据,要多初始化一些。
我 CE 的原因及其生草,因为我有一个变量是
t
i
m
e
time
time ,我把
t
i
m
e
time
time 改成了
t
i
m
tim
tim 就 A 了。
。。。。。。
表
示
很
淦
\color{white}表示很淦
表示很淦
代码
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std
;
struct node
{
long long to
, next
, x
;
}e1
[10000001], e2
[10000001];
long long n
, m
, p
, x
, y
, z
, ans
, le1
[1000001], le2
[1000001], k
, dis1
[1000001], dis2
[1000001], tim
;
bool in
[1000001];
queue
<long long>q
;
int main() {
scanf("%lld", &tim
);
for (long long T
= 1; T
<= tim
; T
++) {
memset(dis1
, 0x7f, sizeof(dis1
));
memset(dis2
, 0x7f, sizeof(dis2
));
memset(le1
, 0, sizeof(le1
));
memset(le2
, 0, sizeof(le2
));
memset(in
, 0, sizeof(in
));
ans
= k
= 0;
scanf("%lld %lld", &n
, &m
);
p
= 1;
for (long long i
= 1; i
<= m
; i
++) {
scanf("%lld %lld %lld", &x
, &y
, &z
);
e1
[++k
] = (node
){y
, le1
[x
], z
}; le1
[x
] = k
;
e2
[k
] = (node
){x
, le2
[y
], z
}; le2
[y
] = k
;
}
q
.push(p
);
in
[p
] = 1;
dis1
[p
] = 0;
while (!q
.empty()) {
long long now
= q
.front();
q
.pop();
for (long long i
= le1
[now
]; i
; i
= e1
[i
].next
) {
long long y
= e1
[i
].to
;
if (dis1
[now
] + e1
[i
].x
< dis1
[y
]) {
dis1
[y
] = dis1
[now
] + e1
[i
].x
;
if (!in
[y
]) {
in
[y
] = 1;
q
.push(y
);
}
}
}
in
[now
] = 0;
}
q
.push(p
);
in
[p
] = 1;
dis2
[p
] = 0;
while (!q
.empty()) {
long long now
= q
.front();
q
.pop();
for (long long i
= le2
[now
]; i
; i
= e2
[i
].next
) {
long long y
= e2
[i
].to
;
if (dis2
[now
] + e2
[i
].x
< dis2
[y
]) {
dis2
[y
] = dis2
[now
] + e2
[i
].x
;
if (!in
[y
]) {
in
[y
] = 1;
q
.push(y
);
}
}
}
in
[now
] = 0;
}
for (long long i
= 1; i
<= n
; i
++)
if (i
!= p
)
ans
+= dis1
[i
] + dis2
[i
];
printf("%lld\n", ans
);
}
return 0;
}