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;//n为路口的数量,m为道路的数量
 5 const int maxn = 500 + 5;
 6 const int maxm = 100000 + 5;
 7 const int INF = 1000000;//无穷大
 8 struct node{
 9     int ci,cj;
10     int type;
11     int cij;
12 }path[2*maxm];
13
14 int Edge[maxn][maxn];//记录两个点之间路径的编号
15 int dist[maxn];//记录源点1到每一个节点的最短路
16 int pro[maxn];//记录每一个节点的前驱结点
17
18 void bellman()
19 {
20     memset(dist,INF,sizeof(dist));
21     dist[1] = 0;
22     memset(pro,-1,sizeof(pro));
23     pro[1] = 0;//1没有前驱
24     for(int k=1;k<n;k++)///进行n-1次松弛操作
25     {
26         bool flag = false;
27         for(int i=0;i<2*m;i++)
28         {
29             if(path[i].type == 0)//大道
30             {
31                 if(dist[path[i].cj] > dist[path[i].ci]+path[i].cij)
32                 {
33                     dist[path[i].cj] = dist[path[i].ci]+path[i].cij;
34                     pro[path[i].cj] = path[i].ci;
35                     flag = true;
36                 }
37              } else{//小道
38              //首先要计算出连续走小路多长时间
39                 int con = path[i].cij;
40                 int temp = i;
41                  if(pro[path[i].ci] != -1 && pro[path[i].ci] != 0)//已经加入,有前驱
42                  {
43
44                      int pathnum = Edge[pro[path[temp].ci]][path[temp].ci];
45                      while( path[pathnum].type == 1)//连续走小道
46                      {
47                          con += path[pathnum].cij;
48                          temp = Edge[pro[path[temp].ci]][path[temp].ci];
49                          if(pro[path[pathnum].ci] == 0) break;//到达起始结点
50                          pathnum = Edge[pro[path[temp].ci]][path[temp].ci];
51                       }
52
53                   }
54                  if(dist[path[i].cj]>dist[path[temp].ci] + con*con)
55                  {
56                      dist[path[i].cj]=dist[path[temp].ci] + con*con;
57                      pro[path[i].cj] = path[i].ci;
58                     flag = true;
59                  }
60              }
61         }
62         if(!flag) break;
63      }
64 }
65
66 int main()
67 {
68
69     while(cin>>n>>m)
70     {
71         for(int i=0;i<2*m;i++)
72         {
73             cin>>path[i].type>>path[i].ci>>path[i].cj>>path[i].cij;
74             i++;
75             path[i].ci = path[i-1].cj;path[i].cj = path[i-1].ci;
76             path[i].cij = path[i-1].cij;path[i].type = path[i-1].type;
77             Edge[path[i].ci][path[i].cj] = i;
78             Edge[path[i].cj][path[i].ci] = i-1;
79         }
80
81         bellman();
82         cout<<dist[n]<<endl;
83     }
84     return 0;
85  }

原文地址:https://www.cnblogs.com/yxh-amysear/p/8495296.html

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

ccf 201712-4 行车路线(70分)的相关文章

70分产品经理——数据驱动产品之路

上周同一做奢侈品电商的大哥聊天,他希望能够找到一个有女性视角的产品经理来改造现有产品,从女性的角度来优化产品体验,提升销售额. 由此,引发我的观点: 一个化腐朽为神奇,能够切中消费者命脉的产品经理,能够实现从70分到90分质的飞跃.但这样的人才往往是可遇而不可求: 基于数据驱动产品,去分析和优化用户的每一步路径,实现产品量的积累,做到70分的产品,可能是更务实的方法. 70分产品经理,不是一骑绝尘的快马,确实可以负重前行千里 WHO 用户是谁?看起来这个问题有一个最直观的答案,对于奢侈品电商来说

「PKUSC2018」星际穿越 (70分做法)

5371: [Pkusc2018]星际穿越 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 27  Solved: 11[Submit][Status][Discuss] Description 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居民之间无法进行交流,因此他们也不知道彼此的存在. 现在,这些星球独

CCF 201712-4 行车路线 最短路

题意:一张n个点的图,有小路和大路,走大路花费的体力值是wi,如果连续走小路,花费的体力是连续走的小路的wi的和的平方,求1到n的最少花费体力 n <= 500, m <= 1e5 大一第一次考CCF的第四题,当年真的还是个最短路都不会的超级萌萌萌萌新,抄挑战的最短路板子(毒瘤代码)骗个40分的部分分,然后当时还怎么想都不明白怎么做 现在看起来就是裸的最短路各种各样的条件这样那样一下而已了= -... 几乎所有单源最短路问题都可以套用d[i]为起点到i点的最短路,这题也一样,如果是小路就记录一

【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

20190718考试70分记

又考试了,这次题明显感觉难多了,骗了不少分,竟然rk13 第一题一看不可做,然后看第二题 第二题一开始也没有思路,然后我就看上了k<=1的情况, 显然k=0时只要求所有数的gcd即可, k=1的话枚举每一个树,给它加1,再求gcd,取gcd最大值 然后看第三题,k<=4有10%的数据,而且样例已经告诉你了k=2和k=3的答案, 那么剩下的只有k=0或k=1或k=4; k=0是0,k=1是1,k=4的话数据小,dfs暴力跑出来了. 这样我就想着暴力跑更多的点,于是有了下面的暴力代码: 1 #in

[华为机试真题]70.分苹果

题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放. 1<=M<=10,1<=N<=10 例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法 输入 7 3 输出 8 思路 设f(m,n) 为m个苹果,n个盘子的放法数目: 当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响.即if(n>m) f(m,n) = f(m,m) 当n<=m:不同的放法可以分成两类: (1)有至少一个盘子空着,即相当于f(m,n) = f(m

CCF(引水入城:60分):最大流+ISAP算法

引水入城 201703-5 这从题目分析来看很像最大流的问题,只需要增加一个超级源点和一个超级汇点就可以按照题意连边再跑最大流算法. 因为数据量太大了,肯定会超时.但是没有想到可行的解决方法. #include<bits/stdc++.h> using namespace std; const long long INF=0XFFFFFFFF; const int maxn=4500016; /* run this program using the console pauser or add

7-48 输出星期名缩写 (70 分)

输入一个1到7的数字,输出对应的星期名的缩写.1 Mon2 Tue3 Wed4 Thu5 Fri6 Sat7 Sun 输入格式: 输入1到7之间数字 输出格式: 输出对应的星期名的缩写 输入样例: 在这里给出一组输入.例如: 1 输出样例: 在这里给出相应的输出.例如: Mon l=['Mon','Tue','Wed','Thu','Fri','Sat','Sun'] day=int(input()) print(l[day-1]) 原文地址:https://www.cnblogs.com/ai