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

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

给出 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. 移动性能测试 | 持续集成中的 Android 稳定性测试

    前言 谈到Android稳定测试,大多数会联想到使用monkey工具来做测试.google官方提供了monkey工具,可以很快速点击被应用,之前我有一篇帖子提到了monkey工具的使用,详见: htt ...

  2. 搭建一个wordpress网站需要做哪些工作

    今天做了自己的个人网站:二飞日志 之前因为服务器的问题,因为备案的原因辛辛苦苦做的站点数据没了.还好的是没有多少数据.没关系,重新来.有了上一次的经验,这次搭建起来比较顺手.但是也出现了几个问题.下面 ...

  3. Oracle trunc函数使用

    select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'), to_char(trunc(sysdate), 'yyyy-mm-dd hh24:mi:ss') f ...

  4. spring aop execution用法

    代码结构: 1. "execution(* com.ebc..*.*(..))" 与 "execution(*  com.ebc..*(..))" 2019-0 ...

  5. 逐行创建、读取并写入txt(matlab) && 生成文件夹里文件名的.bat文件

    fidin=fopen('C:\Users\byte\Desktop\新建文件夹 (4)\tr4.txt','r'); fidout=fopen('C:\Users\byte\Desktop\新建文件 ...

  6. mysql查询过去12个月的数据统计

    SELECT DATE_FORMAT( FROM_UNIXTIME( t.`created_at`, '%Y-%m-%d %H:%i:%S' ), '%Y-%m' ) MONTH, count(t.c ...

  7. my.变身卡

    中级 1620 (4--6级) 高级 8323 (7--9级) 赤炎: 1.老鼠精 135 / 150 2.白骨精 750 3.情丝娘子 264 / 294 4.沙和尚 500 5.九头虫 1835 ...

  8. 跨域的问题(jsonp和cors)

    由于浏览器的同源策略,用户想要跨域访问浏览器就会报错,那么就涉及到解决跨域的问题.最近我接触到的解决方法是两个,jsonp和cors. jsonp(json with padding)我们虽然不能直接 ...

  9. css3重点回顾字体

    1.字体 免费字体下载https://cn.ffonts.net/

  10. 创建Brush对象

    在GDI+中,可使用笔刷,以各种个颜色和图像填充图形,GDI+的Brush类本身是一个抽象的类,所以是不能实例化Brush的 但是GDI+的API提供五个类,就扩展了Brush类并提供了具体的实现方式 ...