【分层图最短路,dijstra】P2939 [USACO09FEB]改造路Revamping Trails

  1 #include<iostream>
  2 #include<string>
  3 #include<queue>
  4 #include<stack>
  5 #include<vector>
  6 #include<map>
  7 #include<cstdio>
  8 #include<cstdlib>
  9 #include<algorithm>
 10 #include<set>
 11 #include<list>
 12 #include<iomanip>
 13 #include<cstring>
 14 #include<cmath>
 15 #include<limits>
 16 using namespace std;
 17
 18 #define au auto
 19 #define debug(i) cout<<"<debug> "<<i<<"<\debug>"<<endl
 20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
 21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
 22 #define LLL __int128
 23 #define Re register
 24 #define il inline
 25 #define mem(a,b) memset(a,(b),sizeof(a))
 26 typedef pair<int, int> intpair;
 27 typedef long long int LL;
 28 const int INF = 0x3f3f3f3f;
 29 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
 30
 31 int cnt;
 32 const int maxn = 5000010;
 33 int n, m, k;
 34
 35 struct Edge
 36 {
 37     int u, nxt;
 38     int w;
 39 }e[maxn];
 40
 41 int head[maxn];
 42
 43 void add(int a, int b, int w)
 44 {
 45     e[++cnt].u = b;
 46     e[cnt].nxt = head[a];
 47     head[a] = cnt;
 48     e[cnt].w = w;
 49 }
 50
 51 typedef struct
 52 {
 53     bool operator ()(const intpair& a, const intpair& b)const
 54     {
 55         return a.second > b.second;
 56     }
 57 }cmp;
 58
 59 int dis[maxn];
 60 bool vis[maxn];
 61 priority_queue<intpair, vector<intpair>, cmp>q;
 62
 63 void dijstra(int x)
 64 {
 65     mem(dis, 0x3f);
 66     mem(vis, false);
 67     dis[x] = 0;
 68     q.push(intpair(x, dis[x]));
 69     while (!q.empty())
 70     {
 71         intpair t = q.top();
 72         q.pop();
 73         if (vis[t.first]) continue;
 74         vis[t.first] = true;
 75         for (int i = head[t.first]; i != -1; i = e[i].nxt)
 76         {
 77             int u = e[i].u;
 78             int w = e[i].w;
 79             if (!vis[u] && dis[u] > t.second + w)
 80             {
 81                 dis[u] = t.second + w;
 82                 q.push(intpair(u, dis[u]));
 83             }
 84         }
 85     }
 86 }
 87
 88 int main()
 89 {
 90     cin >> n >> m >> k;
 91     mem(head, -1);
 92     mfor(i, 1, m)
 93     {
 94         int a, b, c;
 95         cin >> a >> b >> c;
 96         add(a, b, c);
 97         add(b, a, c);
 98         mfor(j, 1, k)
 99         {
100             add(j * n + a, j * n + b, c);
101             add(j * n + b, j * n + a, c);
102             add((j - 1) * n + a, j * n + b, 0);
103             add((j - 1) * n + b, j * n + a, 0);
104         }
105     }
106     dijstra(1);
107     int ans = dis[n];
108     mfor(i, 1, k)
109     {
110         ans = min(ans, dis[i * n + n]);
111     }
112     cout << ans;
113     return 0;
114 }

原文地址:https://www.cnblogs.com/thjkhdf12/p/11732023.html

时间: 2024-10-10 19:02:02

【分层图最短路,dijstra】P2939 [USACO09FEB]改造路Revamping Trails的相关文章

P2939 [USACO09FEB]改造路Revamping Trails

传送门 显然的分层图 设 dis [ i ] [ j ] 表示到点 i , 已经建立了 j 条高速公路的最短距离 然后转移每次都分建立高速公路和不建立高速公路两种情况 跑Djikstra #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> using namespace std

【luogu P2939 [USACO09FEB]改造路Revamping Trails】 题解

题目链接:https://www.luogu.org/problemnew/show/P2939 本来说是双倍经验题,跟飞行路线一样的,结果我飞行路线拿deque优化SPFA过了这里过不了了. 所以多学一种优先队列优化. #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long lon

USACO09FEB 改造路Revamping Trails(分层图模板)

满分做法: 因为\(k\)很小,所以把每个点拆出\(k\)个点,对应使了多少个高速,这个就是分层图了. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<cmath> using namespace std; typedef long long ll; const int maxm=300

luoguP2939 [USACO09FEB]改造路Revamping Trails

约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路.在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为0. 请帮助约翰决定对哪些小径进行升级,使他每天早上到牧场W花的时间最少.输出这个最少 的时间. 分层图DP,启发良多 1.远离SPFA,Dijstra+堆稳定多了 2.要在Dijstra中Dp,堆中必须包含三要素:当前点.层数.距离,缺一

[USACO09FEB]改造路Revamping Trails

题目描述 Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= 50,000) trails conveniently numbered 1..M from pasture 1 all the way out to pasture N (a journey which is always possible for trail maps given in the test

P2939 [USACO09FEB]改造路[分层图最短路]

题意翻译 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 速公路.在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为0. 请帮助约翰决定对哪些小径进行升级,使他每天从1号牧场到第N号牧场所花的时间最短 解析 提高练习场看到这题,瞄一眼,诶,这不是分层图裸题吗??? [啥是分层图] 分层图,简单来说,就是把一张图复制多次,分为多份,每层图代表一种

【USACO09FEB】改造路Revamping Trails

链接 显而易见的 dp 方程,dp [ x ] [ i ] 表示到达点 x 免费了 i 条边的最短时间. dp [ x ] [ i ] = min ( dp [ pre ] [ i - 1 ] , dp [ pre ] [ i ] + dis [ pre ] [ x ] ) ; 如果直接跑dp,得搞个拓扑图,并且环上信息不会统计. 考虑分层图,然后就是一个分层图模板了. (回家画个图) 1 #include<cstdio> 2 #include<string> 3 #include

poj3635Full Tank?[分层图最短路]

Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Description After going through the receipts from your car trip through Europe this summer, you realised that the gas prices varied between the cities you v

BZOJ 2763 分层图最短路

突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <string> 5 #include <cstring> 6 #include <queue> 7 #include <vector> 8 #define pa pair<int,int