INCARDS - Invitation Cards

    技术2024-08-09  73

    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 1P,Q1000000 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);//极其生草的tim和time 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()) {//正向spfa 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()) {//反向spfa 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; }
    Processed: 0.012, SQL: 9