Gym 100169A 最短路

题意:不久后滑铁卢将会变得非常冷,但是幸运的是,很多建筑都被桥梁和隧道连接着,所以你不需要总是走在外面。但是现在建筑

物之间的连接是错综复杂的,很难知道某两个建筑物之间的最优路线,所以需要你写程序判断。

给出 n 个点,m 条无向边,以及 p 个查询,边分为两种,一种是暴露在外面的边,用 O 表示,另一种是在室内的边,用 I 表示;最优

路线遵循以下规则:

1)尽可能使得路径上暴露在外面的边权值和最少;

2)在满足第一个条件的情况下,尽可能使得总路程最少。

每次查询给出一个 起点 s 和终点 t,求  s -> t 的最优路线。若路线存在则输出路径上暴露在外面的边的总和,以及路径的总和;否则输出

“IMPOSSIBLE”。

分析:

最短路,此时最短路的定义有所改变;

1、outd[v] v到 s 的最短路,此路是暴露在外面的最短路;

2、sumd[v] v到 s 的最短路,此路是总路程最短;

有两种边:

 

1、I 在里面的边;

  1、当 outd[e.to] > outd[u] 时,更新outd 和 sumd

  2、当outd[e.to] ==outd[u] && sumd[e.to] > sumd[u] + e.dist;更新 sumd

2、O在外面的边;

  1、尽管是外面的边,但还是可以选他,其条件是 outd[e.to] > outd[u] + e.dist;更新 outd,sumd

  2、当 outd[e.to] == outd[u] + e.dist&&sum[e.t]>sumd[u] + e.dist;更新sumd

  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 const int maxn = 10005;
  6 const int inf = 0x3f3f3f3f;
  7 
  8 struct Edge {
  9     int from,to,dist,s;
 10 };
 11 
 12 struct HopeNode {
 13     int u,outd,sum;
 14     bool operator < (const HopeNode& rhs) const {
 15         if(outd!=rhs.outd)
 16             return outd > rhs.outd;
 17         else return sum > rhs.sum;
 18     }
 19 };
 20 
 21 struct Dij {
 22     int n,m;
 23     vector<int> G[maxn];
 24     vector<Edge> edges;
 25     int outd[maxn];
 26     int sum[maxn];
 27     bool vis[maxn];
 28 
 29     void init(int n) {
 30         this->n = n;
 31         for(int i=0;i<n;i++)
 32             G[i].clear();
 33         edges.clear();
 34     }
 35 
 36     void AddEdge(int from,int to,int dist,int s) {
 37         edges.push_back((Edge){from,to,dist,s});
 38         m = edges.size();
 39         G[from].push_back(m-1);
 40     }
 41 
 42     void dijstra(int s) {
 43         memset(vis,0,sizeof(vis));
 44         for(int i=0;i<n;i++)
 45         {
 46             outd[i] = inf;
 47             sum[i] = inf;
 48         }
 49 
 50         outd[s] = 0;
 51         sum[s] = 0;
 52 
 53         priority_queue<HopeNode> q;
 54         q.push((HopeNode){s,0,0});
 55         while(!q.empty()) {
 56             HopeNode x = q.top();
 57             q.pop();
 58 
 59             int u = x.u;
 60             if(vis[u])
 61                 continue;
 62             vis[u] = true;
 63             for(int i=0;i<G[u].size();i++) {
 64                 Edge& e = edges[G[u][i]];
 65                 if(e.s==1&&outd[e.to]>outd[u]) {
 66                     outd[e.to] = outd[u];
 67                     sum[e.to] = sum[u] + e.dist;
 68                     q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
 69                 }
 70                 else if(e.s==1&&outd[e.to]==outd[u]&&sum[e.to]>sum[u]+e.dist) {
 71                     sum[e.to] = sum[u] + e.dist;
 72                     q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
 73                 }
 74                 else if(e.s==0&&outd[e.to]>outd[u]+e.dist) {
 75                     outd[e.to] = outd[u] + e.dist;
 76                     sum[e.to] = sum[u] + e.dist;
 77                     q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
 78                 }
 79                 else if(e.s==0&&outd[e.to]==outd[u]+e.dist&&sum[e.to]>sum[u]+e.dist) {
 80                     sum[e.to] = sum[u] + e.dist;
 81                     q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
 82                 }
 83             }
 84         }
 85     }
 86 }sol;
 87 
 88 int main()
 89 {
 90     int n,m,q;
 91     scanf("%d%d%d",&n,&m,&q);
 92     sol.init(n);
 93     for(int i=0;i<m;i++) {
 94         int u,v,d;
 95         char s[5];
 96         scanf("%d%d%d",&u,&v,&d);
 97         scanf("%s",s);
 98         if(s[0]=='I') {
 99         sol.AddEdge(u,v,d,1);
100         sol.AddEdge(v,u,d,1);
101         }
102         else {
103             sol.AddEdge(u,v,d,0);
104             sol.AddEdge(v,u,d,0);
105         }
106     }
107 
108     while(q--) {
109         int s,t;
110         scanf("%d%d",&s,&t);
111         sol.dijstra(s);
112         printf("%d %d\n",sol.outd[t],sol.sum[t]);
113     }
114 
115     return 0;
116 }
View Code

 

  

转载于:https://www.cnblogs.com/TreeDream/p/6659384.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自2020年以来,自动驾驶汽车(Autonomous Vehicle)在这一领域取得了显著进展。 自动驾驶汽车通过使用先进的传感技术,如雷达、激光雷达和摄像头,以及深度学习和人工智能算法,实现了车辆的自主驾驶。它们能够感知周围环境,了解道路状况,并做出相应的决策和行驶动作,从而实现无需人类操控的车辆行驶。 自动驾驶汽车在2020年迅速崭露头角。它们的技术日益成熟,不断的实验和测试表明其在安全性和性能方面已经取得了显著的突破。虽然仍然存在一些挑战,比如在复杂城市环境中导航和处理紧急情况,但这些问题正经过不断的研究和改进来得以解决。 在未来,自动驾驶汽车有望在各个领域发挥重要作用。首先,它们将可以提高道路交通的安全性。由于自动驾驶车辆不受人类司机的疲劳、分心和驾驶误差的限制,它们的驾驶能力更为稳定和准确。其次,自动驾驶汽车还能够提高交通效率。通过与其他车辆实时通信和协同,它们可以避免交通堵塞和减少事故发生,从而减少交通拥堵和行车时间成本。 此外,自动驾驶汽车也将为交通出行带来便利和舒适性。乘客可以更轻松地进行其他活动,如工作、休息或娱乐,而不必担心驾驶问题。老年人和残障人士也将能够自由独立地出行,提高他们的生活质量。 综上所述,作为2020年的重要趋势,自动驾驶汽车具有广阔的应用前景。通过不断的创新和发展,它们将在道路交通安全、交通效率和出行体验方面取得进一步的提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值