CCF 201712-4 行车路线 最短路

题意:一张n个点的图,有小路和大路,走大路花费的体力值是wi,如果连续走小路,花费的体力是连续走的小路的wi的和的平方,求1到n的最少花费体力

n <= 500, m <= 1e5

大一第一次考CCF的第四题,当年真的还是个最短路都不会的超级萌萌萌萌新,抄挑战的最短路板子(毒瘤代码)骗个40分的部分分,然后当时还怎么想都不明白怎么做

现在看起来就是裸的最短路各种各样的条件这样那样一下而已了= -。。。

几乎所有单源最短路问题都可以套用d[i]为起点到i点的最短路,这题也一样,如果是小路就记录一下连续走了多长的小路距离,换成新的体力花费然后松弛就行

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<vector>
 6 #include<queue>
 7 #define INF 0x3f3f3f3f
 8 #define LL long long
 9 #define debug(x) cout << "[" << x << "]" << endl
10 using namespace std;
11
12 const int maxn = 510;
13 struct edge{
14     int v, id;
15     LL w;
16     edge(int v = 0, LL w = 0, int id = 0): v(v), w(w), id(id){}
17     bool operator < (const edge& a) const{
18         return w > a.w;
19     }
20 };
21 vector<edge> e[maxn];
22 bool vis[maxn];
23 LL d[maxn], sum[maxn];
24
25 void dijk(){
26     memset(d, INF, sizeof d);
27     priority_queue<edge> q;
28     d[1] = 0;
29     q.push(edge(1, 0, 0));
30     while (!q.empty()){
31         int u = q.top().v; q.pop();
32         if (vis[u]) continue;
33         vis[u] = 1;
34         for (int i = 0; i < e[u].size(); i++){
35             int v = e[u][i].v;
36             LL w = e[u][i].w, cost = 0;
37             if (e[u][i].id == 1){
38                 LL tmp = sum[u]+w;
39                 cost = d[u]-sum[u]*sum[u]+tmp*tmp;
40             }
41             else cost = d[u]+w;
42             if (d[v] > cost){
43                 d[v] = cost;
44                 if (e[u][i].id == 1) sum[v] = sum[u]+w;
45                 else sum[v] = 0;
46                 q.push(edge(v, d[v], 0));
47             }
48         }
49     }
50 }
51
52 int main(){
53     int n, m, t, a, b;
54     LL c;
55     scanf("%d%d", &n, &m);
56     for (int i = 0; i < m; i++){
57         scanf("%d%d%d%lld", &t, &a, &b, &c);
58         e[a].push_back(edge(b, c, t));
59         e[b].push_back(edge(a, c, t));
60     }
61     dijk();
62     printf("%lld\n", d[n]);
63     return 0;
64 }

原文地址:https://www.cnblogs.com/QAQorz/p/9588268.html

时间: 2024-07-31 15:51:49

CCF 201712-4 行车路线 最短路的相关文章

ccf 201712-4 行车路线(70分)

ccf 201712-4 行车路线 解题思路: 首先Dijkstra是基于贪心算法的,即每一次作出的选择都具有贪心选择性.此题由于有"如果连续走小道,小明的疲劳值会快速增加,连续走s公里小明会增加s2的疲劳度."这种情况,所以不能使用Dijkstra算法. 这里使用Bellman-Ford算法 70分备份待修改: 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int n,m;/

Codevs1041&amp;&amp;Vijos1119 car的旅行路线(最短路dijkstra)

Codevs1041&&Vijos1119  car的旅行路线(最短路) 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t. 那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教.任务找出一条从城市A到B的旅游

【CCF】行车路线 改编Dijkstra

[AC] #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=

ccf 2017 12 - 4 行车路线

附上代码: #include<stdio.h> #include<string.h> #define inf 0x7fffffff #include<iostream> #include<algorithm> #include<queue> using namespace std; typedef long long ll; const int MAXM = 1e6 + 5; int n, m; typedef struct NODE { int

BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )

找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 -------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #incl

BZOJ1880 SDOI2009 Elaxia的路线 最短路+拓扑排序

题意:给定两个点对和一张无向图,求两个点对的最短路中,重边边权和的最大值 题解: 首先从给出的四个点出发跑出到其他所有点的最短路,然后判断哪些边是重边.找出所有重边后,将其构有向图,在该图上用拓扑排序求最长路. 开始的时候枚举每一条边我没有建反向边,而是每次判定的时候互换一下边的始末点看是否合法,结果最后一个点死活过不去.后来上网搜题解才知道,必须建反向边,与原边分别判断.果然偷懒就是不行啊…… #include <cstdio> #include <cstring> #inclu

BZOJ 1266 上学路线(最短路+最小割)

给出n个点的无向图,每条边有两个属性,边权和代价. 第一问求1-n的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预处理出所有最短路径. 然后我们要删除的边集一定是这个图的一个割.否则最短路径不会增加.即求此图的最小割. # include <cstdio> # include <cstring> # include <cstdlib> # include <iostream>

luogu P2149 [SDOI2009]Elaxia的路线 |最短路+建最短路图+卡常数

题目描述 最近,Elaxia 和 w** 的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们必须合理地安排两个人在一起的时间. Elaxia 和 w** 每天都要奔波于宿舍和实验室之间,他们 希望在节约时间的前提下,一起走的时间尽可能的长. 现在已知的是 Elaxia 和 w** 所在的宿舍和实验室的编号以及学校的地图: 地图上有 n 个路口,m 条路,经过每条路都需要一定的时间. 具体地说,就是要求无向图中,两对点间最短路的最长公共路径. 输入格式 第一行两个正整数 n,m,表示点

CCF CSP个人题解汇总

趁着这波考CCF热来骗一波访问量 祝自己免修算法RP++ 区域赛RP++ 1.2题汇总在这:https://www.cnblogs.com/QAQorz/p/9650890.html 201803-4 棋局评估(对抗搜索):https://www.cnblogs.com/QAQorz/p/9650828.html 201712-4 行车路线(最短路):https://www.cnblogs.com/QAQorz/p/9588268.html 原文地址:https://www.cnblogs.co