看到这题,第一印象,用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分)的更多相关文章

  1. CCF(317号子任务)-35分:Dijikstra算法

    317号子任务 201903-5 为了过前60分,想使用dijikstra优化算法的,但是最后还是只过了35分.这里的思路只需要先将所有的行星据点进行一次dijikstra,分别存储所有点到行星的最短 ...

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

    [题目背景]“你在平原上走着走着,突然迎面遇到一堵墙,这墙向上无限高,向下无限深,向左无限远,向右无限远,这墙是什么?”——<流浪地球>原著我们带着地球去流浪了,为了处理流浪过程中可能会发 ...

  3. CCF(再卖菜60分)爆搜+记忆化搜索+差分约束

    201809-4 再卖菜 我使用的是爆搜解决,只得了60分. 记忆化搜索 差分约束 #include<iostream> #include<cstdio> #include&l ...

  4. 湖人VS爵士!!科比4月14日最后一战,本赛季最高得分!狂得60分!!完美大逆转!!!

    莫愁前路无知己,天下谁人不识君.科比,愿你如迈克尔·乔丹,仍然活跃在篮球界.退役不是结束,而是另一段人生的开始. 北京时间2016年4月14日,湖人101-96击败爵士,科比-布莱恩特告别战,20年职 ...

  5. 洛谷 P1038 神经网络 Label:拓扑排序 && 坑 60分待查

    题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...

  6. P1967 货车运输 -60分

    打了一个最大生成树+dfs,60分成功tle #include <bits/stdc++.h> using namespace std; const int maxn = 10005; c ...

  7. 利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

    利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. import java.util.Scanner; public clas ...

  8. 获取数值型数组中大于60的元素个数,给数值型数组中不足60分的加20分。(数组,for循环,if条件判断语句)

    package com.Summer_0420.cn; /** * @author Summer * 获取数值型数组中大于60的元素个数 * 给数值型数组中不足60分的加20分 */ public c ...

  9. 根据考试成绩输出对应的礼物,90分以上爸爸给买电脑,80分以上爸爸给买手机, 60分以上爸爸请吃一顿大餐,60分以下爸爸给买学习资料。 要求:该题使用多重if完成

    package com.Summer_0417.cn; import java.util.Scanner; /** * @author Summer * 根据考试成绩输出对应的礼物, * 90分以上爸 ...

随机推荐

  1. 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest D:Distribution in Metagonia(构造)

    http://codeforces.com/gym/100801/attachments 题意:给出一个数n(1 <= n <= 1e18),将 n 拆成 m 个整数,其中 m 必须是 2 ...

  2. js查询checkbox已选择的值

    $("input[id^=ck]").each(function(index,e){ if($(e).is(":checked")) { userArray.p ...

  3. 【深入浅出-JVM】(34):CMS 回收器

    概念 Concurrent Mark Sweep 并发标记清除(多线程并且用的标记清除算法),会造成大量的内存碎片,离散的可用空间无法分配较大的对象 流程 参数 -XX:-CMSPrecleaning ...

  4. Linux命令学习-cp命令

    Linux中,cp命令的全称是copy,主要作用是复制文件或文件夹,类似于Windows下的复制功能. 假设当前处于wintest用户的主目录,路径为 /home/wintest ,存在文件夹test ...

  5. Java连载6-变量的要求

    一.数据类型的作用 (1)不同的数据有不同的类型,不同的数据类型底层会分配不同的大小的空间 (2)数据类型是指程序在运行阶段应该分配多大的内存空间 二.变量要求 变量中存储的具体的“数据”必须和变量的 ...

  6. 题解 P5367 【【模板】康托展开】

    P5367 [模板]康托展开 感觉这题难度大概在绿题到蓝题之间qwq 一.洛谷日报[yummy]浅谈康托展开 如我想知道321是{1,2,3}中第几个小的数可以这样考虑 : 第一位是3,当第一位的数小 ...

  7. Python学习2——Python单行注释、整段注释使用方法

    Python中的注释有多种,有单行注释,多行注释,批量注释,中文注释也是常用的. python注释也有自己的规范,在文章中会介绍到. 注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被 ...

  8. 找bug的过程

    关于昨天程序出差我找bug的过程记录 昨天才程序 https://www.cnblogs.com/pythonywy/p/11006273.html ├── xxxx │ ├── src.py │ └ ...

  9. baserecyclerviewadapterhelper -- setOnItemChildClickListener出现的问题

    出现问题 使用baserecyclerviewadapterhelper 的时候使用 adapter.setOnItemChildClickListener()方法,点击没有反应. adapter.s ...

  10. phpStudy集成环境apche+openssl配置本地https

    OpenSSl windows环境搭建 网上各种文章都说需要下载多个工具,实际上只要一个程序就好,下载地址http://slproweb.com/products/Win32OpenSSL.html ...