ccpc20190823
04
http://acm.hdu.edu.cn/showproblem.php?pid=6705
分析;先把每条边以 形式放进堆,堆按路径权值从小到大排序,然后每次取出堆顶,用v的出边扩展 新的路径。但是一个点的出度可能会非常大(如菊花图),可以发现,将出边排序之后,
每次只需要扩 展当前点最小的出边,和扩展到当前点的边的下一条边即可。堆中需要记录当前结点,当前距离,上一 节点距离,扩展到当前节点时下一条应该扩展的边。
(注意,如果一次性扩展当前点连出去的所有权值 相同的边,是会TLE的,实际上也是没有必要的。)
复杂度:O(k*log(m+k))
- #include<queue>
- #include<vector>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- typedef long long ll;
- #define pb push_back
- const int M=1e5+;
- struct node{
- ll cost;
- int u,id;
- node(ll costt=,int uu=,int idd= ){
- cost=costt;
- u=uu;
- id=idd;
- }
- bool operator < ( const node &b)const{
- return cost>b.cost;
- }
- };
- #define pli pair<ll,int>
- vector<pli> e[M];
- ll ans[M];
- int a[M];
- priority_queue<node> que;
- int main(){
- int t;
- scanf("%d",&t);
- while(t--){
- int n,m,q;
- scanf("%d%d%d",&n,&m,&q);
- for(int i=;i<=n;i++)
- e[i].clear();
- while(!que.empty())
- que.pop();
- for(int i=;i<=m;i++){
- int u,v;
- ll w;
- scanf("%d%d%lld",&u,&v,&w);
- e[u].pb(pli(w,v));
- }
- int maxxk=;
- for(int i=;i<=q;i++){
- scanf("%d",&a[i]);
- maxxk=max(maxxk,a[i]);
- }
- for(int i=;i<=n;i++)
- sort(e[i].begin(),e[i].end());
- for(int i=;i<=n;i++)
- if(e[i].size())
- que.push(node(e[i][].first,i,));
- int tot=;
- while(!que.empty()){
- node now=que.top();
- que.pop();
- int u=now.u;
- int id=now.id;
- ll Cost=now.cost;
- if(Cost)
- ans[++tot]=Cost;
- if(tot==maxxk)
- break;
- if(id<(int)e[u].size()-)
- que.push(node(Cost-e[u][id].first+e[u][id+].first,u,id+));
- int v=e[u][id].second;
- if(e[v].size())
- que.push(node(Cost+e[v][].first,v,));
- }
- for(int i=;i<=q;i++)
- printf("%lld\n",ans[a[i]]);
- }
- return ;
- }
ccpc20190823的更多相关文章
随机推荐
- retrofit 上传文件 跟参数
@Multipart @POST("postFied") Call<Void> postFied(@PartMap Map<String,String> m ...
- 快速排序&基数排序
//快速排序 #include<stdio.h> void QuickSort(int R[],int low,int high) { int i=low,j=high; int pivo ...
- 微信小程序官方示例 官方weui-wxss下载于安装 详解
1.小程序示例源码:https://github.com/wechat-miniprogram/miniprogram-demo 2.微信 weui下载地址:https://github.com/we ...
- 编程作业2.1:Logistic regression
题目 在这部分的练习中,你将建立一个逻辑回归模型来预测一个学生是否能进入大学.假设你是一所大学的行政管理人员,你想根据两门考试的结果,来决定每个申请人是否被录取.你有以前申请人的历史数据,可以将其用作 ...
- PAT Advanced 1010 Radix(25) [⼆分法]
题目 Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The ...
- ZJNU 1699 - Bits
可得应当优先寻找最大的2^n-1这个数 如果l的位数不等于r的位数,那么这个数 2^n-1 就是最优解(每一位全为1) 如果l和r的位数相同,先看r是否符合 2^n-1,符合直接返回,不符合的话拆除最 ...
- [HAOI2018]苹果树(组合数学)
首先有个很奇妙而且很有用的性质:每个二叉树对应唯一的中序遍历,然后每个二叉树出现概率相同.所以n个节点的二叉树形态是n!种(题目中说了*n!已经是提示了),对每种方案求和即可得到期望.令f[i]表示i ...
- visual studio2019下静态链接库的制作
创建静态库项目 项目名称为20199324lib // pch.h #ifndef __PCH__ #define __PCH__ extern int add(int a, int b);//ext ...
- vi几个常用的命令
1.同时打开多个文件:vi 1.txt 2.txt 3.txt 在多个文件中来回切换,命令行模式输入“:next"表示下一个,输入":previous"代表进入上一个,” ...
- Adobe Photoshop、Adobe Illustrator、Bohemian的Sketch、Figma比较
整体来说: Adobe Photoshop:位图图像编辑处理,更适合图片编辑和数码绘画处理: Adobe Illustrator:矢量设计,更适合图标设计和图形设计处理: Sketch:矢量设计,更适 ...