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

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

给出 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

 #include <bits/stdc++.h>

 using namespace std;

 const int maxn = ;
const int inf = 0x3f3f3f3f; struct Edge {
int from,to,dist,s;
}; struct HopeNode {
int u,outd,sum;
bool operator < (const HopeNode& rhs) const {
if(outd!=rhs.outd)
return outd > rhs.outd;
else return sum > rhs.sum;
}
}; struct Dij {
int n,m;
vector<int> G[maxn];
vector<Edge> edges;
int outd[maxn];
int sum[maxn];
bool vis[maxn]; void init(int n) {
this->n = n;
for(int i=;i<n;i++)
G[i].clear();
edges.clear();
} void AddEdge(int from,int to,int dist,int s) {
edges.push_back((Edge){from,to,dist,s});
m = edges.size();
G[from].push_back(m-);
} void dijstra(int s) {
memset(vis,,sizeof(vis));
for(int i=;i<n;i++)
{
outd[i] = inf;
sum[i] = inf;
} outd[s] = ;
sum[s] = ; priority_queue<HopeNode> q;
q.push((HopeNode){s,,});
while(!q.empty()) {
HopeNode x = q.top();
q.pop(); int u = x.u;
if(vis[u])
continue;
vis[u] = true;
for(int i=;i<G[u].size();i++) {
Edge& e = edges[G[u][i]];
if(e.s==&&outd[e.to]>outd[u]) {
outd[e.to] = outd[u];
sum[e.to] = sum[u] + e.dist;
q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
}
else if(e.s==&&outd[e.to]==outd[u]&&sum[e.to]>sum[u]+e.dist) {
sum[e.to] = sum[u] + e.dist;
q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
}
else if(e.s==&&outd[e.to]>outd[u]+e.dist) {
outd[e.to] = outd[u] + e.dist;
sum[e.to] = sum[u] + e.dist;
q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
}
else if(e.s==&&outd[e.to]==outd[u]+e.dist&&sum[e.to]>sum[u]+e.dist) {
sum[e.to] = sum[u] + e.dist;
q.push((HopeNode){e.to,outd[e.to],sum[e.to]});
}
}
}
}
}sol; int main()
{
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
sol.init(n);
for(int i=;i<m;i++) {
int u,v,d;
char s[];
scanf("%d%d%d",&u,&v,&d);
scanf("%s",s);
if(s[]=='I') {
sol.AddEdge(u,v,d,);
sol.AddEdge(v,u,d,);
}
else {
sol.AddEdge(u,v,d,);
sol.AddEdge(v,u,d,);
}
} while(q--) {
int s,t;
scanf("%d%d",&s,&t);
sol.dijstra(s);
printf("%d %d\n",sol.outd[t],sol.sum[t]);
} return ;
}

  

Gym 100169A 最短路的更多相关文章

  1. 【最短路】NEERC15 F Froggy Ford(2015-2016 ACM-ICPC)(Codeforces GYM 100851)

    题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...

  2. 【最短路】BAPC2014 B Button Bashing (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  3. Gym 101873C - Joyride - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://codeforces.com/gym/101873/problem/C 题意: 这是七月的又一个阳光灿烂的日子,你决定和你的小女儿一起度过快乐的一天.因为她真的很喜欢隔壁镇上的 ...

  4. Codeforces Gym 100338C Important Roads 最短路+Tarjan找桥

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  5. Gym - 100625D Destination Unknown 最短路

    http://codeforces.com/gym/100625/attachments/download/3213/2013-benelux-algorithm-programming-contes ...

  6. Gym - 100625J Jailbreak 最短路+搜索

    http://codeforces.com/gym/100625/attachments/download/3213/2013-benelux-algorithm-programming-contes ...

  7. Codeforces Gym 101630J Travelling from Petersburg to Moscow (最短路)

    题目链接 http://codeforces.com/gym/101630/attachments 题解 zyb学长的题. 先枚举第\(k\)大的边权,设其边权为\(x\),然后把每条边边权减掉\(x ...

  8. 【最短路】【Heap-dijkstra】Gym - 101147B - Street

    按题意把图建出来跑最短路就行了.注意遮挡不会影响答案,所以不必考虑,因为走直线经过遮挡的时候,一定不会比答案更优. #include<cstdio> #include<algorit ...

  9. Gym:101630J - Journey from Petersburg to Moscow(最短路)

    题意:求1到N的最短路,最短路的定义为路径上最大的K条边. 思路:对于每种边权,假设为X,它是第K大,那么小于X的变为0,大于K的,边权-X.然后求最短路,用dis[N]+K*X更新答案. 而小于K的 ...

随机推荐

  1. js Form表单转json格式,及后台接收(多种方法)

    转载:https://blog.csdn.net/qq_40138785/article/details/81533015 一.serialize()方法格式:var data = $("# ...

  2. C++: int int& int * int**的区别、联系和用途

    1.int; int是C++关键字,表示整型,其大小是32位有符号整型,表示的范围是-2,147,483,648 到 2,147,483,647:在声明和定义变量时使用,它表示的意思是所声明或所定义的 ...

  3. java——删除HashMap中所有的键值对

    第一种:❌(报错) import java.util.HashMap; import java.util.Set; public class T{ public static void main(St ...

  4. gitlab 邮件配置

    vim /etc/gitlab/gitlab.rb gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "sm ...

  5. Django media的设置

    django在定义模型时需要一些上传的文件,例如图片 class Banner(models.Model): """ 轮播图models titles 标题 images ...

  6. @ControllerAdvice 拦截异常并统一处理

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...

  7. xml和json互转

    开发过程中有些时候需要把xml和json互转,如某钱X接口入参和出参都是xml格式的,十分蛋疼.特写下面工具类,以留用. 需要引用jar: <!-- https://mvnrepository. ...

  8. 加解密---Base64

    1.算法实现: 1.1 JDK提供: package com.exiuge.mytest; import sun.misc.BASE64Decoder; import sun.misc.BASE64E ...

  9. SQL事务的四种隔离级别

    1未提交读(Read uncommitted):完全不锁表,所以会出现脏数据.2提交读(Read committed):1.事务1中update才锁表,可以select到最新数据. 事务2select ...

  10. maya2017安装失败如何卸载重装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...