首页 > 其他分享 >1030 Travel Plan(dijsktra + dfs/bfs + 回溯)

1030 Travel Plan(dijsktra + dfs/bfs + 回溯)

时间:2024-11-26 21:32:47浏览次数:6  
标签:dist int Travel dfs bfs vector child dis

 题面意思比较清晰,就是优先最短路,同距离取最小花费。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n, m, s, d;
 4 typedef pair<int, int> pii;
 5 vector<pii> graph[505];
 6 set<pii> min_heap;
 7 int cost[505][505] = {0};
 8 vector<bool> visited(505, false);
 9 vector<bool> dfs_visited(505, false);
10 vector<int> dist(505,0x3f3f3f);
11 vector<int> prefix[505]; //记录前结点的队列
12 vector<int> result; //记录最终路径
13 int minimum = 0x3f3f3f; //记录最小花费
14 
15 void dijkstra(int start) {
16     visited[start] = true;
17     dist[start] = 0;
18     min_heap.insert(make_pair(0,start));
19     while(!min_heap.empty()) {
20         auto iter = min_heap.begin();
21         int root = iter -> second;
22         visited[root] = true;
23         min_heap.erase(iter);
24         for(auto i : graph[root]) {
25             int child = i.first;
26             int dis = i.second;
27             if (!visited[child]) {
28                 if (dist[child] > dist[root] + dis) {
29                     prefix[child].clear();
30                     min_heap.erase(make_pair(dist[child], child));
31                     dist[child] = dist[root] + dis;
32                     min_heap.insert(make_pair(dist[child], child));
33                     prefix[child].push_back(root);
34                 } else if (dist[child] == dist[root] + dis) { //同距离添加到前缀队列中
35                     prefix[child].push_back(root);
36                 }
37             }
38         }
39     }
40 }
41 void dfs(int p, int end, int cnt, vector<int> path) {
42     dfs_visited[p] = true;
43     if (p == end) {
44         if (cnt < minimum) {
45             result = path;
46             minimum = cnt;
47         }
48         return;
49     }
50 
51     for (auto i : prefix[p]) {
52         if (!dfs_visited[i]) {
53             vector<int> temp = path;
54             temp.push_back(i);
55             dfs(i, end, cnt + cost[p][i], temp);
56             dfs_visited[i] = false;
57         }
58     }
59 }
60 int main() {
61     cin >> n >> m >> s >> d;
62     for (int i = 0; i < m; ++ i) {
63         int c1, c2, dis, cos;
64         cin >> c1 >> c2 >> dis >> cos;
65         graph[c1].push_back(make_pair(c2, dis));
66         graph[c2].push_back(make_pair(c1, dis));
67         cost[c1][c2] = cos;
68         cost[c2][c1] = cos;
69     }
70     dijkstra(s);
71     vector<int> temp;
72     temp.push_back(d);
73     dfs(d, s, 0, temp); //由于记录的是前结点,遍历时从目的到起点
74     reverse(result.begin(),result.end()); //反转一下路径
75     for (auto i : result) {
76         cout << i << " ";
77     }
78     cout << dist[d] << " " << minimum;
79 }

 

标签:dist,int,Travel,dfs,bfs,vector,child,dis
From: https://www.cnblogs.com/coderhrz/p/18571029

相关文章

  • ICPC2022济南站C. DFS Order 2 题解 回滚背包
    题目链接:https://www.luogu.com.cn/problem/P9669题目大意:给你一棵包含\(n\)个节点的有根树。节点编号从\(1\)到\(n\),节点\(1\)是根节点。从节点\(1\)出发对整棵树进行深度优先遍历,会得到很多不同的DFS序。解题思路:基本上和9981day大佬的题解一模一样差不多。......
  • 2024算法基础公选课练习五(DFS2)
    一、前言因为此次题目较多,我也不想分成两篇博客来发,我就直接给代码了,如果题目有需要强调的地方再特殊说明二、题目总览三、具体题目3.1问题A:勘探油田我的代码8方向的floodfill模型#include<bits/stdc++.h>usingi64=longlong;constexprintN=1e2+5,M=......
  • DFS 基础
    判父亲法voiddfs(intu){ //保存父亲 //标记父亲 if()//如果父亲是答案就输出(判父亲法) { //输出答案 } else//如果父亲不是答案,继续从下一代找 { for(inti=1;i<=N;i++)//枚举第u代的所有孩子的i { //生成孩子 if()//判断孩子的合法性 { dfs(i......
  • 洛谷 P1219 八皇后 DFS
    #include<bits/stdc++.h>usingnamespacestd;inta[14]={0};intb[14]={0};intc[28]={0};intd[28]={0};intn;vector<int>vc1;vector<vector<int>>vc2;set<string>st;voiddfs(intstep){ if(step==n+1) { vc2.push_back(vc1......
  • HDOJ 1495 非常可乐 BFS
    调了好久把自己整笑了,肝完这题立马喝了一瓶可乐泄愤,小孩子才分可乐,我全都要#include<bits/stdc++.h>usingnamespacestd;structnode{ intm,l,r,cot;};intvis[102][102][102];intmain(){ inta,b,c; while(cin>>a>>b>>c) { if(a==0) break; if(a%2) { ......
  • DFS入门笔记
    DFS深度优先搜索-入门笔记DFS依靠递归的思想,总是往更远的方向行进,直到达到边界,再返回到上一步考虑另外的方向(递归-回溯)递归实现指数型枚举从\(1\)~\(n\)这\(n\)个整数中随机选取任意多个,输出所有可能的选择方案,即计算\(2^n\)我们考虑有\(n\)个空位,每次都选择填......
  • 每日OJ题_牛客_AB20走迷宫_BFS_C++_Java
    目录牛客_AB20走迷宫_BFS题目解析C++代码Java代码牛客_AB20走迷宫_BFS走迷宫_牛客题霸_牛客网(nowcoder.com)描述:        给定一个n×m的网格,在网格中每次在不超过边界的情况下可以选择向上、向下、向左、向右移动一格。网格中的一些格子上放置有障碍物,放有......
  • 01 bfs 学习笔记
    当一张图的边权只有\(0\)和\(1\)时,跑dij的堆优化显得比较累赘。因为只有两个取值,所以取\(0\)的时候在队列前面推进来,反之在后面。其他和dij没什么区别,时间复杂度\(O(m)\),其中\(m\)是边数。相关题目:P4554小明的游戏。点击查看代码voidwork(){ m0(vis);mem(di......
  • 1601 添加运算符 枚举 递归dfs
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e3+10,inf=0x3f3f3f3f;inta[N],vis[N];intn,ans;//计算函数:根据运算符i对sum和a[x]进行运算intcal(intsum,inti,intx){if(i==1)returnsum+a[x];//加法......
  • 【大数据技术基础 | 实验三】HDFS实验:部署HDFS
    文章目录一、实验目的二、实验要求三、实验原理(一)分布式文件系统(二)HDFS(三)HDFS基本命令(四)HDFS适用场景四、实验环境五、实验内容和步骤(一)在master服务器上确定存在hadoop安装目录(二)配置集群服务器之间SSH免密登录(三)修改HDFS配置文件(四)启动HDFS(五)通过查看进程的方式验证H......