ccf 201903-5 317号子任务(60分)
看到这题,第一印象,用dijkstra算法求n次单源最短路,时间复杂度O(n^3),超时30分妥妥的。
于是用优先队列优化,O(n*mlogm),快很多,但依然30。
那么不妨换一种思路,题目要求的是任一据点到最近k个行星发动机据点的最短路之和,也就是说我们不必求出所有的最短路,而只需要求出各行星发动机据点到其它据点的最短路。
若行星发动机据点个数为t,则只需求t次最短路,这样一来,时间复杂度变为O(t*mlogm)。
又见子任务:对于60%的数据 保证行星发动机数量和k相同。
于是,有60分的数据时间复杂度可降到O(k*mlogm),大约10^7,这60分算是稳了!
我是用邻接表存储图。然后把每次求出的最短路push进n个优先队列,Dijkstra结束后对n个据点从小到大出队、求和并输出。
60分代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
struct E
{
int u,v,w;
}edge[];
struct Node
{
int n,w;
bool operator<(const Node&t)const{
return w>t.w;
}
};
priority_queue<int,vector<int>,greater<int> >d[];
int book[],next[+],first[];
int n,m,k;
void Dijkstra(int x)
{
priority_queue<Node>Q;
int dis[];
for(int i=;i<n;i++){
dis[i]=inf;
}
dis[x]=;
Q.push((Node){x,});
while(!Q.empty()){
Node t=Q.top();Q.pop();
if(t.w!=dis[t.n])continue;
d[t.n].push(t.w);
int p=first[t.n];
while(p!=-){
E&e=edge[p%];
int u=e.v;
if(u==t.n)u=e.u;
if(dis[u]>dis[t.n]+e.w){
dis[u]=dis[t.n]+e.w;
Q.push((Node){u,dis[u]});
}
p=next[p];
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k);
int j=;
for(int i=;i<n;i++){
int x;
scanf("%d",&x);
if(x)book[j++]=i;
first[i]=-;
}
book[j]=-;
for(int i=;i<m;i++){
int&u=edge[i].u,&v=edge[i].v,&w=edge[i].w;
scanf("%d%d%d",&u,&v,&w);
u--;v--;
next[i]=first[u];
first[u]=i;
next[i+]=first[v];
first[v]=i+;
}
for(int i=;book[i]!=-;i++){
Dijkstra(book[i]);
}
for(int i=;i<n;i++){
ll ans=;int cnt=k;
while(!d[i].empty()&&cnt--){
ans+=d[i].top();
d[i].pop();
}
printf("%lld\n",ans);
}
return ;
}
不过还是很想知道究竟怎样才能满分啊QAQ 求指教Orz
ccf 201903-5 317号子任务(60分)的更多相关文章
- CCF(317号子任务)-35分:Dijikstra算法
317号子任务 201903-5 为了过前60分,想使用dijikstra优化算法的,但是最后还是只过了35分.这里的思路只需要先将所有的行星据点进行一次dijikstra,分别存储所有点到行星的最短 ...
- 第16次CCF CSP认证-第5题-317 号子任务(subtask317)-图论最短路径
[题目背景]“你在平原上走着走着,突然迎面遇到一堵墙,这墙向上无限高,向下无限深,向左无限远,向右无限远,这墙是什么?”——<流浪地球>原著我们带着地球去流浪了,为了处理流浪过程中可能会发 ...
- CCF(再卖菜60分)爆搜+记忆化搜索+差分约束
201809-4 再卖菜 我使用的是爆搜解决,只得了60分. 记忆化搜索 差分约束 #include<iostream> #include<cstdio> #include&l ...
- 湖人VS爵士!!科比4月14日最后一战,本赛季最高得分!狂得60分!!完美大逆转!!!
莫愁前路无知己,天下谁人不识君.科比,愿你如迈克尔·乔丹,仍然活跃在篮球界.退役不是结束,而是另一段人生的开始. 北京时间2016年4月14日,湖人101-96击败爵士,科比-布莱恩特告别战,20年职 ...
- 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- P1967 货车运输 -60分
打了一个最大生成树+dfs,60分成功tle #include <bits/stdc++.h> using namespace std; const int maxn = 10005; c ...
- 利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. import java.util.Scanner; public clas ...
- 获取数值型数组中大于60的元素个数,给数值型数组中不足60分的加20分。(数组,for循环,if条件判断语句)
package com.Summer_0420.cn; /** * @author Summer * 获取数值型数组中大于60的元素个数 * 给数值型数组中不足60分的加20分 */ public c ...
- 根据考试成绩输出对应的礼物,90分以上爸爸给买电脑,80分以上爸爸给买手机, 60分以上爸爸请吃一顿大餐,60分以下爸爸给买学习资料。 要求:该题使用多重if完成
package com.Summer_0417.cn; import java.util.Scanner; /** * @author Summer * 根据考试成绩输出对应的礼物, * 90分以上爸 ...
随机推荐
- HDU 6053:TrickGCD(莫比乌斯反演)
题目链接 题意 给出n个数,问在这n个数里面,有多少组bi(1<=bi<=ai)可以使得任意两个bi不互质. 思路 想法就是枚举2~min(ai),然后去对于每个ai都去除以这些质数,然后 ...
- 解决 Prometheus 不能获取 Kubernetes 集群上 Windows 节点的 Metrics
背景 接上一篇 快速搭建 Windows Kubernetes , 我们发现原来在 Windows Kubernetes 会有一些与在 Linux 上使用不一样的体验,俗称坑,例如 hostAlias ...
- C++模版的用法
模板是实现代码重用机制的一种工具,实质就是实现类型参数化,即把类型定义为参数. C++提供两种模板:函数模板,类模板 函数模板 template <typename T> T myMax( ...
- Modbus RTU 通信应用案例
如何打开项目归档文件 例程中的TIA博途项目文件与STEP 7项目文件均为归档文件,需要按如下方式打开: TIA博途项目文件 1. 打开TIA博途软件,通过软件左下方“项目视图”按钮切换至项目视图: ...
- 4.秋招复习简单整理之java支持多继承吗?
java仅支持单继承,但支持接口多实现.
- 新手上路——it人如何保持竞争力
新手上路——如何保持竞争力 JINGZHENGLI 套用葛大爷的一句名言:21世纪什么最贵,人才.哪你是人才还是人材?还是人财或人裁?相信大家都不是最后一种.何如保持住这个光环呢?就需要我们保持我们独 ...
- Zeppelin0.5.6使用spark解释器
Zeppelin为0.5.6 Zeppelin默认自带本地spark,可以不依赖任何集群,下载bin包,解压安装就可以使用. 使用其他的spark集群在yarn模式下. 配置: vi zeppelin ...
- py+selenium 报错NameError: name 'NoSuchElementException' is not defined【已解决】
报错:NameError: name 'NoSuchElementException' is not defined 如图 解决方法: 头部加一句:from selenium.common.exc ...
- 在 Microsoft.VisualStudio.Setup.Engine.Install(Product product, String destination, CancellationToken token)无法在相同位置或现有实例“20cc4971”的子目录上安装指定实例“ebc82a8e”的解决方案
在所在的安装目录根目录下搜索实例 如 20cc4971 将文件夹全部删除. 一般默认安装在C盘,所以在C盘搜索实例文件夹,将其全部删除.
- vbox 设置时间不与主机同步
C:\Users\2345-lp0395>"D:\Program Files\Oracle\VirtualBox\VBoxManage.exe" setexadata win ...