当前位置:   article > 正文

每日一题(PTA Advanced1003):Emergency-dfs

每日一题(PTA Advanced1003):Emergency-dfs

我的代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main(){
  4. int num_city;
  5. int num_road;
  6. int start;
  7. int end;
  8. int Max=-1;
  9. cin>>num_city>>num_road>>start>>end;
  10. vector<int> is_vis(num_city,0);
  11. vector<int> aid(num_city);
  12. for(int i=0;i<num_city;i++){
  13. cin>>aid[i];
  14. }
  15. int x,y,dis;
  16. vector<vector<int>>path (num_road,vector<int>(num_road,0));
  17. for(int i=0;i<num_road;i++){
  18. cin>>x>>y>>dis;
  19. path[x][y]=path[y][x]=dis;
  20. }
  21. int shortest_path=99999999;
  22. int res_num=0;
  23. //int res_sum=0;
  24. function<void(int ,int,int)> dfs = [&](int node,int length,int sum) {
  25. if(length>shortest_path) return;
  26. if(node==end){
  27. if(length ==shortest_path){res_num++;Max=max(sum,Max);}
  28. if(length<shortest_path) {res_num=1;shortest_path=length;Max=sum;}
  29. return;
  30. }
  31. for(int i=0;i<num_city;i++){
  32. if(is_vis[i]==0 && path[i][node]!=0){
  33. is_vis[i]=1;
  34. dfs(i,length+path[i][node],sum+aid[i]);
  35. is_vis[i]=0;
  36. }
  37. }
  38. };
  39. is_vis[start]=1;
  40. dfs(start,0,aid[start]);
  41. cout<<res_num<<" "<<Max;
  42. return 0;
  43. }

佬的代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAX_LEN = 0x3f3f3f3f;
  4. const int c_maxn = 500+10;
  5. int G[c_maxn][c_maxn]; //城市地图
  6. int c_pro[c_maxn]; //每个城市的救火队数量
  7. int vis[c_maxn]; //-1为有回路、0为正在访问、1为已访问
  8. int c_n, r_n, sta, fin; //城市数量,道路数量,起点、终点
  9. int Min=MAX_LEN, Max = -1, num_r = 0; //最优路程和救火队数量
  10. void dfs(int u, int len, int value) {
  11. if(len > Min) return; //剪枝
  12. if(u == fin) {
  13. if(Min > len) { //如果路程更短,则直接更新
  14. Min = len; Max = value;
  15. num_r = 1;
  16. } else if(Min == len) { //如果路程相等,则比较救火队数量
  17. Max = max(value, Max);
  18. num_r++;
  19. }
  20. return;
  21. }
  22. for(int v = 0; v < c_n; v++) {
  23. if(G[u][v] != -1) {
  24. if(vis[v] == 1) continue;
  25. vis[v] = 1;
  26. dfs(v, len+G[u][v], value+c_pro[v]);
  27. vis[v] = 0;
  28. }
  29. // cout << u << ' ' << v << ' ' << G[u][v] << '\n';
  30. }
  31. }
  32. int main() {
  33. memset(G, -1, sizeof(G));
  34. cin >> c_n >> r_n >> sta >> fin;
  35. for(int i = 0; i < c_n; i++) cin >> c_pro[i];
  36. for(int i = 0; i < r_n; i++) {
  37. int x1, x2, v;
  38. cin >> x1 >> x2 >> v;
  39. G[x1][x2] = G[x2][x1] = v;
  40. }
  41. vis[sta] = 1;
  42. dfs(sta, 0, c_pro[sta]); //起始节点、道路长度、起始救火队数量
  43. cout << num_r << ' ' << Max << '\n';
  44. return 0;
  45. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/626968
推荐阅读
相关标签
  

闽ICP备14008679号