广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
2014-08-01 22:57
344 查看
题目链接:http://poj.org/problem?id=3411
题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途中,之前已经走过Cityc(可能会等于a),那么就可以交p的钱,否则之前未走过Cityc,就一定要交r 的路费啦。
注意,一个点可以被反复多次走,也就是可能构成环,虽然路走长了,但路费便宜了,这个问题要考虑到。还有就是剪枝啦:如果当前求得的路费比以前求得的答案要大,那就要回溯。
mincost 明明是全局变量,多手在main里又重新声明,搞了我1个多小时才发现 = =....
题目意思:N个city 由 m 条路连接,对于一条路(假设连接Cityia和 Cityb),如果从Citya 去 Cityb的途中,之前已经走过Cityc(可能会等于a),那么就可以交p的钱,否则之前未走过Cityc,就一定要交r 的路费啦。
注意,一个点可以被反复多次走,也就是可能构成环,虽然路走长了,但路费便宜了,这个问题要考虑到。还有就是剪枝啦:如果当前求得的路费比以前求得的答案要大,那就要回溯。
mincost 明明是全局变量,多手在main里又重新声明,搞了我1个多小时才发现 = =....
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int maxn = 1000 + 5; int head[maxn]; int point_vis[maxn]; int N, m, mincost; struct adjlist // 邻接表 { int b, c, p, r; int next; }node[maxn]; void dfs(int next, int cost) { if (point_vis[next] > N || cost >= mincost) // 某一点被经过的次数多于N 或者当前cost比之前求出的minsum要大就回溯 return; if (next == N) { mincost = cost; return; } for (int i = head[next]; i != -1; i = node[i].next) { int v = node[i].b; point_vis[node[i].b]++; if (point_vis[node[i].c] >= 1) // 之前这个中间点c有访问过,就可以交纳在点c的费用p dfs(node[i].b, cost+node[i].p); else // 之前该点木有走过,只能乖乖交 r 这个费用了 dfs(node[i].b, cost+node[i].r); point_vis[node[i].b]--; } } int main() { while (scanf("%d%d", &N, &m) != EOF) { int t1, cnt = 0; memset(head, -1, sizeof(head)); for (int i = 0; i < m; i++) { scanf("%d", &t1); node[cnt].next = head[t1]; scanf("%d%d%d%d", &node[cnt].b, &node[cnt].c, &node[cnt].p, &node[cnt].r); head[t1] = cnt++; } memset(point_vis, 0, sizeof(point_vis)); mincost = maxn; point_vis[1]++; dfs(1, 0); if (mincost == maxn) printf("impossible\n"); else printf("%d\n", mincost); } return 0; }
相关文章推荐
- 北邮暑假训练7解题报告
- 北邮暑假训练7解题报告
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
- poj训练计划解题报告(做的不多,,,)
- POJ 3159 Candies 解题报告(Dijkstra & SPFA) 及 双向Dijkstra性能测试
- POJ 2739(连续素数和) 解题报告
- POJ 2186 Tarjan 缩点 解题报告
- POJ 3087 解题报告
- (解题报告)POJ3664---Election Time---用结构体实现两组相关联数据的排序问题
- poj1005 解题报告
- POJ 1041 解题报告 John's trip
- poj1459最高标号预流推进算法解题报告
- POJ-1466-Girls and Boys 解题报告
- poj解题报告——2242
- POJ 3258 River Hopscotch 解题报告(二分)
- poj1001Exponentiation解题报告
- 0827模拟赛解题报告(16年暑假最后一次模拟赛)
- POJ 3264 解题报告
- poj1363--Rails解题报告(c++版)
- POJ 1308 Is It A Tree? 解题报告