1030 Dijkstra+DFS
来源:互联网 发布:java excel导入导出 编辑:程序博客网 时间:2024/05/28 22:08
https://www.patest.cn/contests/pat-a-practise/1030
//原来做完Dijkstra加一个DFS是这么加的。要想好怎么递归//pre[i]存的是到i的之前的所有路径(都是最短路径,从中找出符合条件的)。#include <cstdio>#include <algorithm>#include <vector>using namespace std;int n, m, s, d;int e[510][510], dis[510], cost[510][510];vector<int> pre[510]; //记录s到d的路径。bool visit[510];const int inf = 99999999;vector<int> path, temppath;int mincost = inf;void dfs(int v) { if(v == s) { temppath.push_back(v); int tempcost = 0; for(int i = temppath.size() - 1; i > 0; i--) { int id = temppath[i], nextid = temppath[i-1]; tempcost += cost[id][nextid]; } if(tempcost < mincost) { mincost = tempcost; path = temppath; } temppath.pop_back(); return ; } temppath.push_back(v); for(int i = 0; i < pre[v].size(); i++) //woc,你读都读不明白,d的size当然是1了。 dfs(pre[v][i]); temppath.pop_back(); //3是必须要有的,而且能保证1,2循环完就出去。}int main() { fill(e[0], e[0] + 510 * 510, inf); fill(dis, dis + 510, inf); scanf("%d%d%d%d", &n, &m, &s, &d); for(int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); scanf("%d", &e[a][b]); e[b][a] = e[a][b]; scanf("%d", &cost[a][b]); cost[b][a] = cost[a][b]; } pre[s].push_back(s); dis[s] = 0; for(int i = 0; i < n; i++) { int u = -1, minn = inf; for(int j = 0; j < n; j++) { if(visit[j] == false && dis[j] < minn) { u = j; minn = j; } } if(u == -1) break; visit[u] = true; for(int v = 0; v < n; v++) { if(visit[v] == false && e[u][v] != inf) { if(dis[v] > dis[u] + e[u][v]) { dis[v] = dis[u] + e[u][v]; pre[v].clear(); pre[v].push_back(u); } else if(dis[v] == dis[u] + e[u][v]) { //原来精髓在此,相等也push进去。而且push的是进去的点,方便往回DFS pre[v].push_back(u); } } } } dfs(d); //做完Dijkstra做DFS,pre记录的是最短的,所以没有0->3这条。 for(int i = path.size() - 1; i >= 0; i--) printf("%d ", path[i]); printf("%d %d", dis[d], mincost); return 0;}
阅读全文
0 0
- 1030 Dijkstra+DFS
- dijkstra+dfs
- Dijkstra+DFS模板总结
- dijkstra+dfs模板
- 1111 Dijkstra+DFS
- 1018 最短路 Dijkstra+DFS
- 1003. Emergency (25)(Dijkstra + DFS)
- ZOJ 1456 Minimum Transport Cost (dijkstra+dfs)
- PAT 1003. Emergency (25) Dijkstra算法 + DFS
- BFS,DFS,DIJKSTRA算法基础练习
- 最短路径数 Dijkstra+dfs
- 一些算法实现(bfs、dfs、Dijkstra)
- 简述dfs,bfs,Dijkstra思想及区别
- *浙大PAT甲级 1087 dijkstra+dfs
- 1018 Public Bike Management --dijkstra+dfs
- HDU2544最短路(DFS/Dijkstra+heap)
- 图算法之bfs、dfs、prim、Dijkstra
- 1003. Emergency (25)【Dijkstra or DFS】
- aop aspectj pdf [收录]
- iOS
- 时间函数
- openjudge 去除C程序中的注释(大模拟)
- 上了两个月的班,感觉大学一年白读。
- 1030 Dijkstra+DFS
- loadrunner测试springboot的api接口
- POJ 1035 Spell checker 串
- 内网容器化实践
- HDU 3746 Cyclic Nacklace(Next 数组性质)
- Codeforces Round #412 D. Dynamic Problem Scoring (枚举 + 贪心)
- 【08】Bootstrap — 按钮
- Python 学习6
- bzoj 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐(暴力DFS)