第16次CCF CSP认证-第5题-317 号子任务(subtask317)-图论最短路径

【题目背景】
“你在平原上走着走着,突然迎面遇到一堵墙,这墙向上无限高,向下无限深,向
左无限远,向右无限远,这墙是什么?”——《流浪地球》原著
我们带着地球去流浪了,为了处理流浪过程中可能会发生的危机,联合政府找到
你,希望你能协助完成 317 号子任务:制定应急预案。
【题目描述】
地球的表面有 n 个据点,这些据点之间存在 m 条双向道路。
这些据点中,有的是建立在行星发动机之下,受到行星发动机的保护(行星发动机
据点),而其他据点则没有行星发动机的保护(普通据点,比如燃料采集据点/科研据点
等)。
当发生危机的时候,没有行星发动机的保护是非常危险的,所以每个人都需要赶到
最近的行星发动机据点寻求庇护,然而行星发动机据点也不一定安全,再加上行星发动
机据点容量有限,所以有些时候得去第二近或者第三近的行星发动机据点。
联合政府找到你,希望你能够计算出每个据点最近的 k 个行星发动机据点,为了
简化问题,你只需要输出每个据点到最近 k 个行星发动机据点的最短距离之和,如果
某个据点能够到达的行星发动机据点不足 k 个,则输出其能到达的所有行星发动机的
最短距离之和。
【输入格式】
从标准输入读入数据。
输入的第一行包含三个用空格隔开的整数 n, m, k ,含义见题目?述,保证 1 ≤ n ≤
104, 0 ≤ m ≤ 104, 1 ≤ k ≤ 102。据点依次编号为 1 到 n 。
第二行包含 n 个整数依次表示每个据点的类型,每个数为 1 或 0 (1 表示对应据
点为行星发动机据点,0 表示普通据点)。
接下来 m 行,每行三个整数 u, v,w 表示有一条长度为 w 的双向道路连接 u 号据点
和 v 号据点,1 ≤ u, v ≤ n, 1 ≤ w ≤ 103 。
可能有重边和自环。
【输出格式】
输出到标准输出。
输出 n 行,每行输出一个整数表示答案(见题目?述)

【样例 1 输入】
7 6 2
1 0 1 0 1 1 0
1 4 1
1 2 3
2 4 4
2 3 5
2 5 7
6 7 5
【样例 1 输出】

8

8

10

10

0

5

【样例 1 解释】
该样例的输入对应的图如下,其中红色点是行星发动机据点,白色点是普通据点。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int amn=1e4+5;
 8 const int inf=9e7;
 9 ll ans[amn];
10 int typ[amn],e[amn][amn],k,n,m;
11 int main()
12 {
13     cin>>n>>m>>k;
14     for(int i=1; i<=n; i++)
15     {
16         for(int j=1; j<=n; j++)
17         {
18             if(i==j)e[i][j]=0;
19             else e[i][j]=inf;
20         }
21     }
22     for(int i=1; i<=n; i++)
23     {
24         int tt;
25         cin>>tt;
26         typ[i]=tt;
27     }
28     int u,v,w;
29     for(int i=1; i<=m; i++)
30     {
31         cin>>u>>v>>w;
32         e[u][v]=w;
33         e[v][u]=w;
34     }
35     for(int c=1; c<=n; c++)
36     {
37         for(int i=1; i<=n; i++)
38         {
39             for(int j=1; j<=n; j++)
40                 if(e[i][k]<inf&&e[k][j]<inf&&e[i][j]>e[i][c]+e[c][j])
41                     e[i][j]=e[i][c]+e[c][j];
42         }
43     }
44 //    cout<<endl<<endl;///查看图的最短路径(调试用)
45 //    for(int i=1; i<=n; i++)
46 //    {
47 //        for(int j=1; j<=n; j++)
48 //        {
49 //            printf("%10d",e[i][j]);
50 //        }
51 //        cout<<endl<<endl;
52 //    }
53     for(int i=1; i<=n; i++)
54     {
55         int top=0;
56         memset(ans,0,sizeof(ans));
57         for(int j=1; j<=n; j++)
58         {
59             if(e[i][j]<inf&&typ[j])
60             {
61                 ans[top++]=e[i][j];
62             }
63         }
64         sort(ans,ans+top);
65         ll sum=0;
66         for(int i=0; i<k&&i<top; i++)
67         {
68             sum+=ans[i];
69         }
70         cout<<sum<<endl;
71     }
72     return 0;
73 }
74 /*
75 样例
76
77 7 6 2
78 1 0 1 0 1 1 0
79 1 4 1
80 1 2 3
81 2 4 4
82 2 3 5
83 2 5 7
84 6 7 5
85
86 */

原文地址:https://www.cnblogs.com/brainm/p/10548893.html

时间: 2024-08-30 01:00:35

第16次CCF CSP认证-第5题-317 号子任务(subtask317)-图论最短路径的相关文章

2019年12月ccf csp认证第三题-判断是否配平化学方程式

#include<bits/stdc++.h> using namespace std; int n; string s; void solve_son(queue<string>&q,int bei,map<string,int>&m) { while(!q.empty()) { string ts = q.front(); q.pop(); if(ts=="(") { int left = 1,right = 0; queue&l

记第十七次CCF CSP认证

记第十七次CCF CSP认证 第一二题很简单,就是简单的模拟就可以了,后面的第三四题用了近一个小时才看懂,但是感觉好复杂,不好写,能力不行,写不出来.第五题,就想到了暴力,其他就不会了,但是我没有去写,因为感觉这个复杂度就算写了也过不了.最后检查了几遍第一二题的代码,范围我开的都比题目要求的大一个数量级.最后就过了这两个题. 下次12月份继续! 原文地址:https://www.cnblogs.com/alking1001/p/11536021.html

poj1985&amp;&amp;第四次CCF软件认证第4题 求树的直径

Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 4216   Accepted: 2137 Case Time Limit: 1000MS Description After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has com

CCF能力认证历届第二题

201809-2. 买菜 解题思路: 主要就是判断小H和小W的装车时间段是否有重叠区间.关于判断重叠区间,对于给定的两个区间(a,b)和(c,d),显然当且仅当a≤d且b≥c时才会有重叠区间,而重叠区间长度L为min(b,d)-max(a,c),把所有重叠区间的长度进行累加求和,就可以知道俩人可以聊多长时间. 100分代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 void Input(int a[][2],int n); /

关于2019年ccf第五题317号子任务

第一次接触图论算法写出来这一题以后可以通过测试样例,但是提交以后总是提示错误,先挂着...不知道什么时候找出bug (最后return前的system(“pause”) 是用来在vs里面调试用的) 希望大佬也能帮忙看下错误噢(今天刚刚申请的博客) 1 #include<iostream> 2 #include <algorithm> 3 using namespace std; 4 #define inf 1001 5 int a[10000][10000];//矩阵 6 bool

CCF CSP 201712-2 游戏

题目链接:http://118.190.20.162/view.page?gpid=T67 问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1.若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数.当游戏中只剩下一个小朋友时,该小朋友获胜.

第十八次CSP认证游记 | 2019.12.15

CSP认证的考试是Haogod介绍的,取得一定成绩之后能有机会参加CCSP的分赛区和全国决赛.这次来参加认证要感谢LZ老师的奔走为我们申请报销,虽然最终因为这仅仅是一个考试报名费和差旅费下不来,但是老师还是为我们争取了"廊坊-北京"的动车票的报销,可以说是非常感动了. 这是我第一次参加CSP认证,很幸运能和阳哥和Haogod一起来北邮考试,顺便可以膜拜一下行业内名校. 说实话自从去年11月NOIP结束之后还没有像这样坐在考场完整打一次比赛,因为CSP认证似乎对于我们来说没什么用(除了可

CSP认证考试(第九次)第二题

试题编号: 2 试题名称: 工资计算 时间限制: 10.0s 内存限制: 512.0MB 问题描述: 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S-3500元: 2) A中不超过1500元的部分,税率3%: 3) A中超过1500元未超过4500

火车购票问题(16年ccf)

问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排5个座位.为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号. 购票时,一个人可能购一张或多张票,最多不超过5张.如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位.否则应该安排在编号最小的几个空座位中(不考虑是否相邻). 假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令. 输入