2019ccpc网络赛hdu6705 path

path

题目传送门

解题思路

先用vector存图,然后将每个vector按照边的权值从小到大排序。将每个顶点作为起点的边里最短的边存入优先队列。对于存入的路径的信息,应有起点,终点,权值,以及最新加入的边是其起点的第几短边。优先队列按照权值从小到大排序,每次出队当前最短的路径,对于一条路径,更新两条新的可能最短的路径,即这条路后面加上一条可走的最短边,以及这条路最后一条边换成一条次短边。将询问排序,不断更新答案即可。

代码如下

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

const int N = 100010;

struct T{
    int x, y, f;
    ll w;
    T(int x, int y, ll w, int f): x(x), y(y), w(w), f(f){}
    bool operator<(const T& a)const{
        return w > a.w;
    }
};

struct line{
    int r;
    ll w;
    line(int r, ll w): r(r), w(w){}
    bool operator<(const line& a)const{
        return w < a.w;
    }
};
vector<line> vec[N];
struct R{
    int i, k;
    bool operator<(const R& a)const{
        return k < a.k;
    }
}qy[N];
ll ans[N];
priority_queue<T> pq;

int main()
{
    int t;
    scanf("%d", &t);
    while(t --){
        int n, m, q;
        scanf("%d%d%d", &n, &m, &q);
        for(int i = 1; i <= m; i ++){
            int u, v;
            ll w;
            scanf("%d%d%lld", &u, &v, &w);
            vec[u].push_back(line(v, w));
        }
        for(int i = 1; i <= n; i ++){
            sort(vec[i].begin(), vec[i].end());
        }
        for(int i = 1; i <= n; i ++){
            if(vec[i].size())
                pq.push(T(i, vec[i][0].r, vec[i][0].w, 0));
        }
        for(int i = 1; i <= q; i ++){
            scanf("%d", &qy[i].k);
            qy[i].i = i;
        }
        sort(qy + 1, qy + q + 1);
        int cnt = 0;
        int id = 1;
        while(!pq.empty()){
            int x = pq.top().x;
            int y = pq.top().y;
            ll w = pq.top().w;
            int f = pq.top().f;
            pq.pop();
            ++cnt;
            while(id <= q && cnt == qy[id].k){
                ans[qy[id].i] = w;
                ++id;
            }
            if(id > q)
                break;
            if(vec[y].size())
                pq.push(T(y, vec[y][0].r, w + vec[y][0].w, 0));
            if(vec[x].size() > f + 1)
                pq.push(T(x, vec[x][f + 1].r, w + vec[x][f + 1].w - vec[x][f].w, f + 1));
        }
        for(int i = 1; i <= q; i ++){
            printf("%lld\n", ans[i]);
        }
        for(int i = 0; i <= n; i ++)
            vec[i].clear();
        while(!pq.empty())
            pq.pop();
    }
    return 0;
}

原文地址:https://www.cnblogs.com/whisperlzw/p/11403890.html

时间: 2024-10-15 20:17:02

2019ccpc网络赛hdu6705 path的相关文章

2019CCPC网络预选赛 1004 path 最短路

题意:给你一张n个点m条边的有向图,问这张有向图的所有路径中第k短的路径长度是多少?n, m, k均为5e4级别. 思路:前些日子有一场div3的F和这个题有点像,但是那个题要求的是最短路,并且k最大只有400.这个题的做法其实是一个套路(没见过QAQ). 首先把每个点的出边按边权从小到大排序,把每个点边权最小的那条边放入优先队列.对于优先队列中的每个点,记录一下这个点是从哪个点转移过来(last),转移过来的边对于last来说是第几小(rank).这时,从当前点now选一条边权最小的边,形成新

hdu6075 2019CCPC网络选拔赛1004 path

题意:给定一个带权有向图,有q组询问,每次询问在有向图的所有路径中,第k小的路径权值 解题思路:因为k最大只有5e4,考虑暴力搜索出前maxk小的路径并用数组记录权值,然后就可以O(1)查询. 具体实现:暴力搜索时可以借助Dijkstra最短路的思想,即用已知的最短路更新得出新的最短路.先将所有的边都装进一个multiset里面,然后每次将multiset里的首元素取出,作为新的答案,然后再用它来更新新的最短路,这样不断扩散的话就可以得到答案. 但是,这样可能会TLE或MLE,考虑再加加优化,首

2019CCPC网络赛 HDU 6702——找规律

题意 给定 $A,B$(都是正整数),求使得 $(A\  xor\  C) \& (B \ xor \  C)$ 最小的正整数 $C$,如果有多个满足条件的 $C$,输出最小的 $C$. 分析 看题3秒就猜到 $C = A \& B$,并写了个暴力程序对拍了一下,发现没错(然而wa了两发). $C$ 要求为正整数,所以 $C=0$ 时输出1 #include<bits/stdc++.h> using namespace std; typedef long long ll; ll

2019CCPC网络赛 HD6707——杜教筛

题意 求 $f(n,a,b)=\sum_{i=1}^n \sum_{j=1}^i gcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)$,$1 \le n,a,b \le 10^9$,共有 $T$ 组测试,其中只有10组的 $n$ 大于 $10^6$. 分析 首先,当 $i, j$互质,$a, b$互质时,有 $gcd(i^a-j^a,i^b-j^b)=i-j$(证明见 链接),也可以打表猜一猜嘛. 可以推出:$$\sum_{d=1}^{N}\mu(d)\cdot

2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛

Banana Bananas are the favoured food of monkeys. In the forest, there is a Banana Company that provides bananas from different places. The company has two lists. The first list records the types of bananas preferred by different monkeys, and the seco

HDU-4041-Eliminate Witches! (11年北京网络赛!!)

Eliminate Witches! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1124    Accepted Submission(s): 426 Problem Description Kaname Madoka is a Magical Girl(Mahou Shoujo/Puella Magi). The duty of

hdu6153 A Secret CCPC网络赛 51nod 1277 KMP

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6153 题意: 给出两个字符串S1,S2,求S2的所有后缀在S1中出现的次数与其长度的乘积之和. 思路: CCPC网络赛题解: https://post.icpc-camp.org/d/714-ccpc-2017 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277   是一样的 将s1,s2翻转,转化为求前缀在s1中出

2015长春网络赛总结

早上七点多就(冻)醒来了,训练了一个暑假,acm生涯的第一场网络赛,很激动. 九点开打,我拔不出网线,用的机房电脑,装的cb有问题,不能编译,只好用dev.男神电脑插上网线没有网,习惯了linux可能不习惯吧.这提醒我们以后一定要早点去把环境调好. 第三分钟,G题有人A了.我跟560开始看题,男神还在弄电脑.题意是给你n个数(n<1000),然后q(q<1000)次询问,要求你输出[l,r]区间的最大值.数据很小,我说暴力,然后560说线段树,然后模板13分钟1Y.然后560开始搞J,一个貌似

2015长春、沈阳网络赛总结

我所说的总结并不是谈什么题目解法之类的东西 这些东西网上有很多题解 说说这两场网赛吧! 这两场我的状态还行,只是xiaodong还没有找到状态,长春赛lucas+中国剩余定理他硬是打了一整场,还是没打出来,版题没打出来确实不该 wzb状态一般,不过看题的能力依然那么厉害 长春赛中,很遗憾的只出了5道题,按当时过题数目,应该是7道德,可是小东的lucas那题没打出来,而我打得后缀数组那题,当顺时针的时候不用看是否是下标最前面的,但是反过来就需要看了,当时想当然的认为不用,交了4发,一直wa到比赛结