1. 程式人生 > >L. Magical Girl Haze(ACM-ICPC 2018 南京賽區網路預賽,分層最短路,堆優化的dijkstra)

L. Magical Girl Haze(ACM-ICPC 2018 南京賽區網路預賽,分層最短路,堆優化的dijkstra)

描述

There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u,v≤n). Every road has a distance c_ici. Haze is a Magical Girl that lives in City 11, she can choose no more than KK roads and make their distances become 00. Now she wants to go to City NN, please help her calculate the minimum distance.

Input

The first line has one integer T(1 \le T\le 5)T(1≤T≤5), then following TT cases.

For each test case, the first line has three integers N, MN,M and KK.

Then the following MM lines each line has three integers, describe a road, U_i, V_i, C_iUi,Vi,Ci. There might be multiple edges between uu and vv.

It is guaranteed that N \le 100000, M \le 200000, K \le 10N≤100000,M≤200000,K≤10,
0 \le C_i \le 1e90≤Ci≤1e9. There is at least one path between City 11 and City NN.

Output

For each test case, print the minimum distance.

樣例輸入

1
5 6 1
1 2 2
1 3 4
2 4 3
3 4 1
3 5 6
4 5 2

樣例輸出

3

題目來源

思路

給出一個

n個點m條邊的有向圖,要從1點走到n點,有k次機會使得某一條邊的花費變成0,求從1走到n的最小花費.

我們需要利用類似動態規劃的思想來進行轉移。

我們定義:

  • dis[i][j]:從起點sti點,使用了j次優惠機會所使用的最小花費.
  • vis[i][j]:從起點sti點,使用了j次優惠機會這個狀態有沒有被標記

我們需要對普通的迪傑斯特拉轉移的時候進行一些改變:

  1. 不使用免費機會的時候:

    如果 到點u的花費dis[u][k]+從u到v的邊權w<到v的邊權dis[v][k]
    正常轉移更新:dis[v][k]=dis[u][k]+w
    加入堆q.push(node(v,k,dis[v][k]))
  2. 使用免費機會的時候:

    如果 到點u的時候使用了k次機會的花費dis[u][k]<到v點的時候使用了k+1次機會的邊權dis[v][k+1]
    這條邊免費更新dis[v][k+1]=dis[u][k]
    加入堆q.push(node(v,k+1,dis[v+1][k]))

剩下的就是迪傑斯特拉的堆優化模板了。

程式碼

#include <bits/stdc++.h>
using namespace std;
#define mem(a, b) memset(a, b, sizeof(a))
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10;
int first[N], tot;
int n, m, k;
struct edge
{
    int v, w, next;
} e[N * 2];
void add_edge(int u, int v, int w)
{
    e[tot].v = v, e[tot].w = w;
    e[tot].next = first[u];
    first[u] = tot++;
}
void init()
{
    mem(first, -1);
    tot = 0;
}
struct node
{
    int id, k, now;
    node() {}
    node(int _id, int _k, int _now)
    {
        id = _id, k = _k, now = _now;
    }
    bool friend operator<(node a, node b)
    {
        return a.now > b.now;
    }
};
int dis[N][12], vis[N][12];
void dijkstra(int st)
{
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j <= k; j++)
        {
            dis[i][j] = inf;
            vis[i][j] = 0;
        }
    }
    dis[st][0] = 0;
    priority_queue<node> q;
    q.push(node(st, 0, 0));
    while (!q.empty())
    {
        node u = q.top();
        q.pop();
        if (!vis[u.id][u.k])
        {
            vis[u.id][u.k] = 1;
            for (int i = first[u.id]; ~i; i = e[i].next)
            {
                int v = e[i].v, w = e[i].w;
                if (!vis[v][u.k] && dis[u.id][u.k] + w < dis[v][u.k])
                {
                    dis[v][u.k] = dis[u.id][u.k] + w;
                    q.push(node(v, u.k, dis[v][u.k]));
                }
                if (u.k < k && !vis[v][u.k] && dis[u.id][u.k] < dis[v][u.k + 1])
                {
                    dis[v][u.k + 1] = dis[u.id][u.k];
                    q.push(node(v, u.k + 1, dis[v][u.k + 1]));
                }
            }
        }
    }
}
void solve()
{
    int u, v, w;
    scanf("%d%d%d", &n, &m, &k);
    init();
    for (int i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &u, &v, &w);
        add_edge(u, v, w);
    }
    dijkstra(1);
    int ans = inf;
    for (int i = 0; i <= k; i++)
        ans = min(ans, dis[n][i]);
    printf("%d\n", ans);
}
int main()
{
    //freopen("in.txt", "r", stdin);
    int t;
    scanf("%d", &t);
    while (t--)
        solve();
    return 0;
}

相關推薦

L. Magical Girl Haze(ACM-ICPC 2018 南京賽區網路預賽,分層短路優化dijkstra)

描述 There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u,v≤n). Every road has a distan

ACM-ICPC 2018 南京賽區網路預賽 L. Magical Girl Hazedijkstra+分層短路

思路來源 https://blog.csdn.net/zhangche0526/article/details/62881066 題意 給你n個城市,m條邊, 共有k次免費機會,可以將其中k條邊的權值變為0, 求點1到點n的最短路。 題解 (百度 分層圖最短路

ACM-ICPC 2018 南京賽區網路預賽 L. Magical Girl Haze

There are NNN cities in the country, and MMM directional roads from uuu to v(1≤u,v≤n)v(1\le u, v\le n)v(1≤u,v≤n). Every road has a distanc

ACM-ICPC 2018 南京賽區網路預賽 L. Magical Girl Haze

題目傳送門 簡要說下題意: N個城市,有M條邊相連,現在可以任意選中k條邊把這k條邊的長度置位0,然後求從1---N的最短路徑 想到最短路徑沒有負權,基本想到的是Dijkstra。這個演算法主要寫起來比較方便,spfa一樣,個人不喜歡(兩個演算法昆哥上課講過,不懂的

ACM-ICPC 2018 南京賽區網路預賽Magical Girl Haze分層圖】

Description:    There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u,v≤n). Every road has a dis

ACM-ICPC 2018 南京賽區網路預賽(A.B.E.G.J.L

遇事不決先打表,然後發現規律, #pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; #define clr(a) memset(a,0,sizeof(a)) #defin

ACM-ICPC 2018 南京賽區網路預賽 J AC Challenge (狀壓dp)

題意 給你n道題,在你做第 i i {i}道題的時候有 p[j] p

L. Poor God Water(ACM-ICPC 2018 焦作賽區網路預賽 快速矩陣冪)

God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him that some sequence of eating will make them poi

AC Challenge [ ACM-ICPC 2018 南京賽區網路預賽 ] [dfs + 二進位制記憶化搜尋 ]

題意:有n個問題,做第i個問題得分是t*a[i]+bi, 但是做第i題之前還需要先做其他的一些題目….可以選擇不做完所有的題,問最後的最高得分. 思路:深搜就可以了,跟很多深搜的問題一樣,有很多重複的子問題,此題的記憶化很奇特用的二進位制類似狀壓的思想 AC co

ACM-ICPC 2018 南京賽區網路預賽 J.Sum [ 類打表 ]

A square-free integer is an integer which is indivisible by any square number except 11. For example, 6 = 2 \cdot 36=2⋅3 is square-free, but

#數論、分層短路# ACM-ICPC 2018 南京賽區網路預賽

題目連結 An Olympian Math Problem Alice, a student of grade 66, is thinking about an Olympian Math problem, but she feels so despair that she c

ACM-ICPC 2018 南京賽區網路預賽 B. The writing on the wall(暴力)

題目連結:傳送門   題意:詢問你在一個n*m的矩陣中,有一些方塊被塗成了黑色,其他的方格為白色,讓你統計白方格形成的子矩陣的個數。   思路:比賽的時候沒有想去做,賽後補題的時候發現優美的暴力就能過,也有點遺憾。 觀看了大佬的部落格後~~~ 首先我們會求

ACM-ICPC 2018 南京賽區網路預賽 J. Sum(篩法+分塊)

題目連結:傳送門   題意:給你一個數字n,讓你求從1到n的每個數的乘數組合的個數,要求乘數滿足不能被平方數整除。   解決方法:比賽的時候想到用線性篩來先將不符合的數先標記出來,然後再去便利統計個數。一開始t了,後來改成分塊後因為程式碼寫挫wa了好多次,還是自己

ACM-ICPC 2018 南京賽區網路預賽

題意: 每個作業都有a和b,第i次做這個作業得到的分數為i*a+b。每個作業還可能會有前置作業。 問你最大分數是多少。可以不做。 POINT: 20個作業,可以狀壓。時間就是這個狀態1的

ACM-ICPC 2018 南京賽區網路預賽 C. GDY

題解 題目大意 n個人m張牌 從1號開始按順序每人直接取5張牌 題目保證每人都會有牌但不保證最後一個人的牌夠5張 類似於撲克牌大小關係2>1>13>12>…>4>3 從1開始出最小的牌 每次只能出一張 每次出牌只能出比上一

ACM-ICPC 2018 南京賽區網路預賽 J. Sum

A square-free integer is an integer which is indivisible by any square number except 11. For example, 6 = 2 \cdot 36=2⋅3 is square-free, b

L. Poor God Water [ ACM-ICPC 2018 焦作賽區網路預賽 ]

顯然是矩陣快速冪的題,暴力枚舉了係數,挺悲哀的。得到的4階係數矩陣對前5項不成立。十分抱歉還沒有理解這個轉移的道理。 ACcode #include <set> #inclu

ACM-ICPC 2018 南京賽區網路預賽部分題解

5題順利進現場 A 簽到 思路:打表找規律即可 L 最短路 隊友秒過,聽說是BZOJ原題,改為有向圖 J 線性篩 / 分塊打表 ,ans=f(n)的字首和 線性篩:

ACM-ICPC 2018 南京賽區網路預賽 I. Skr (迴文樹)

A number is skr, if and only if it's unchanged after being reversed. For example, "12321", "11" and "1" are skr numbers, but "123", "221"

ACM-ICPC 2018 南京賽區網路預賽-I:Skr(manacher+Hash)

A number is skr, if and only if it’s unchanged after being reversed. For example, “12321”, “11” and “1” are skr numbers, but “123”,