广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告

题目链接:http://poj.org/problem?id=3411

题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途中,之前已经走过Cityc(可能会等于a),那么就可以交p的钱,否则之前未走过Cityc,就一定要交r 的路费啦。

注意,一个点可以被反复多次走,也就是可能构成环,虽然路走长了,但路费便宜了,这个问题要考虑到。还有就是剪枝啦:如果当前求得的路费比以前求得的答案要大,那就要回溯。

mincost 明明是全局变量,多手在main里又重新声明,搞了我1个多小时才发现 = =....

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6
 7 const int maxn = 1000 + 5;
 8 int head[maxn];
 9 int point_vis[maxn];
10 int N, m, mincost;
11
12 struct adjlist   // 邻接表
13 {
14     int b, c, p, r;
15     int next;
16 }node[maxn];
17
18 void dfs(int next, int cost)
19 {
20     if (point_vis[next] > N || cost >= mincost)   // 某一点被经过的次数多于N 或者当前cost比之前求出的minsum要大就回溯
21         return;
22     if (next == N)
23     {
24         mincost = cost;
25         return;
26     }
27     for (int i = head[next]; i != -1; i = node[i].next)
28     {
29         int v = node[i].b;
30         point_vis[node[i].b]++;
31         if (point_vis[node[i].c] >= 1)    // 之前这个中间点c有访问过,就可以交纳在点c的费用p
32             dfs(node[i].b, cost+node[i].p);
33         else      // 之前该点木有走过,只能乖乖交 r 这个费用了
34             dfs(node[i].b, cost+node[i].r);
35         point_vis[node[i].b]--;
36     }
37 }
38
39 int main()
40 {
41     while (scanf("%d%d", &N, &m) != EOF)
42     {
43         int t1, cnt = 0;
44         memset(head, -1, sizeof(head));
45         for (int i = 0; i < m; i++)
46         {
47             scanf("%d", &t1);
48             node[cnt].next = head[t1];
49             scanf("%d%d%d%d", &node[cnt].b, &node[cnt].c, &node[cnt].p, &node[cnt].r);
50             head[t1] = cnt++;
51         }
52         memset(point_vis, 0, sizeof(point_vis));
53         mincost = maxn;
54         point_vis[1]++;
55         dfs(1, 0);
56         if (mincost == maxn)
57             printf("impossible\n");
58         else
59             printf("%d\n", mincost);
60     }
61     return 0;
62 }

广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告,布布扣,bubuko.com

时间: 2024-12-20 19:23:27

广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告的相关文章

暑假第二次考试 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n-2 个路口,分别标上号,A 农场为 1 号,B 农场为 n 号,路口分别为 2...n-1 号,从 A 农场到 B 农场有很多条路径可以到达,而 CG 发现有的路口是必须经过的,即每条路径都经过的路口,CG 要把它们记录下来,这样 CG 就可以先到那个路口,观察新牛们有没有偷懒,而你的任务就是找出所有必经路口. [输入格式] 第一行两个用空格隔开的

【模拟题(电子科大MaxKU)】解题报告

目录: 1:一道简单题[树形问题](Bzoj 1827 奶牛大集会) 2:一道更简单题[矩阵乘法][快速幂] 3:最简单题[技巧] 话说这些题目的名字也是够了.... 题目: 1.一道简单题 时间1s 题目描述 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场中的一个,这些农场由N-1条道路连接,并且从任意一个农场都能够到达另外一个农场.道路i连接农场A_i和B_i

2018年暑假ACM个人训练题9(动态规划)解题报告

A:m段最大字段和问题 https://www.cnblogs.com/yinbiao/p/9314528.html B:map的使用(根本就不是dp!!!) https://www.cnblogs.com/yinbiao/p/9314605.html C:裸LIS问题 https://www.cnblogs.com/yinbiao/p/9150889.html D:状态压缩dp(还没有弄清楚) ..... E:裸LIS问题 https://www.cnblogs.com/yinbiao/p/9

[网络流24题] 13. 星际转移问题 解题报告

13.星际转移问题 题意 有 \(n\) 个太空站, \(m\) 艘太空船, 太空船 \(i\) 一次能容下 \(h_i\) 个人, 每艘太空船会按照自己的航线循环行驶, 每行驶一个站点需要一个单位时间, 求从节点 \(0\) 到节点 \(n+1\) 所需的最小时间. 思路 一道一开始完全没有思路的题, 后来发现姆爷又发了新专, 果断地剁手后听了一会, 这道题就想出来了...... 总思路是把每个太空站都按时间分为若干个节点, 也就是说, 每加一个单位时间, 我们就把这总共 \(n+2\) 个点

【leetCode百题成就】Gas Station解题报告

题目: There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from station i to its next station (i+1). You begin the journey with

POJ 3411 Paid Roads(dfs)

*注:这一题很重要的是对与数据的处理和细节的把握把! http://poj.org/problem?id=3411 题目大意: 有n个城市,m条路,(0<=n,m<=10).从a到b,如果之前已经经过c点,那么付费p,否者付费r.求最小的费用,从1-->n! 注意: There may be more than one road connecting one city with another. so:你不能用map[a][b]存a->b的距离.只能有road [ i ]了. 还有

多次访问节点的DFS POJ 3411 Paid Roads

POJ 3411 Paid Roads Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6553   Accepted: 2430 Description A network of m roads connects N cities (numbered from 1 to N). There may be more than one road connecting one city with another. Some o

CSU-ACM2014暑假集训基础组训练赛(1) 解题报告

•Problem A HDU 4450                 水题,签到题 水题..没啥好说的.给大家签到用的. 1 #include <cstdio> 2 int main(){ 3 int n,a,ans; 4 while(scanf("%d",&n),n){ 5 ans = 0; 6 for(int i = 0;i < n;i++){ 7 scanf("%d",&a); 8 ans += a*a; 9 } 10 pr

poj 3411 Paid Roads(dfs,可重复访问节点)

http://poj.org/problem?id=3411 大致题意:n个城市由m条公路连接,两个城市之间可能有多条公路连接.经过每条公路都需要收费,对于城市a,b,若之前经过城市c那么只需交p元钱,否则交r元钱.问从城市1到n的最小花费. 思路:由于经过每条公路的收费有两种方式,那么有的城市可能要经过多次,以便获得更小的花费,但也有可能出现有环的情况,那么该城市经过多次只会徒增花费.所以我们定义vis[]数组标记该城市访问的次数,在该题中(m <= 10)当一个城市访问超过3次(网上说这个与