题意:

t组输入,给你n个点m条边。你需要输出从s点到t点的最短距离,然后是m条边,每条边输入信息为:

a,b,c 表示从a点到b点的一个无向边长度为c

每一个点会有一个属性L、R或M

如果a和b一个为L,另一个为R,那么a和b之间的距离要增加x,即变为x+c

其他情况权值还是c

题解:

我们可以注意到M类型的点是一个特殊点,无论是L类型还是R类型的点和它相连,它们的距离都不会增加x

那么我么可以把M类型的点拆成两个点,例如a点为M类型的点,那么我们可以把a点变为L类型的点,a+n点变为R类型的点

这个样子去构造一个图,然后如果起点s是一个M类型的点,我们就让起点s和s+n都和0号点连一条权值为0的无向边,然后以0为起点跑一边迪杰斯特拉

否则,就直接以s点为起点跑一边迪杰斯特拉

代码:

#include <stack>
#include <queue>
#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
const int INF=0x3f3f3f3f;
ll n,m,v[maxn];
char f[maxn];
struct shudui
{
ll start,val;
bool operator < (const shudui y)const
{
return val>y.val;
}
} str1,str2;
priority_queue<shudui>r;
vector<shudui>w[maxn];
void JK(ll st)
{
memset(v,INF,sizeof(v));
v[st]=0;
str1.start=st;
str1.val=0;
r.push(str1);
while(!r.empty())
{
ll x,y;
str1=r.top();
r.pop();
x=str1.start;
y=str1.val;
if(v[x]<y) continue;
//说明在这个点再此之后又入队了
//此次出队的并不是s到这个点的最短路,
//所以在这次更新前点v所连的点已经更过一次了
//所以后面也不会进行松弛操作
ll len=w[x].size();
for(ll i=0;i<len;++i)
{
str2=w[x][i];
if((v[x]+str2.val<v[str2.start]))
{
v[str2.start]=v[x]+str2.val;
str1.start=str2.start;
str1.val=v[str2.start];
r.push(str1);
}
}
}
}
void add_edge(ll a,ll b,ll c)
{
str2.start=b;
str2.val=c;
w[a].push_back(str2);
str2.start=a;
w[b].push_back(str2);
} int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
ll s,t,x;
scanf("%lld%lld%lld%lld%lld",&n,&m,&s,&t,&x);
for(ll i=0;i<=2*n;++i)
w[i].clear();
scanf("%s",f+1);
while(m--)
{
ll a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
if(f[a]==f[b]&&(f[a]=='L'||f[b]=='R'))
{
add_edge(a,b,c);
}
else if(f[a]!=f[b]&&f[a]!='M'&&f[b]!='M')
{
add_edge(a,b,c+x);
}
else if(f[a]=='L'&&f[b]=='M')
{
add_edge(a,b,c);
add_edge(a,b+n,c+x);
}
else if(f[a]=='M'&&f[b]=='L')
{
add_edge(a,b,c);
add_edge(a+n,b,c+x);
}
else if(f[a]=='R'&&f[b]=='M')
{
add_edge(a,b,c+x);
add_edge(a,b+n,c);
}
else if(f[a]=='M'&&f[b]=='R')
{
add_edge(a+n,b,c);
add_edge(a,b,c+x);
}
else
{
add_edge(a,b,c);
add_edge(a,b+n,c+x);
add_edge(a+n,b,c+x);
add_edge(a+n,b+n,c);
}
}
ll ans=0;
if(f[s]=='M')
{
add_edge(0,s,0);
add_edge(0,s+n,0);
JK(0);
ans=min(v[t],v[t+n]);
}
else
{
JK(s);
//printf("%lld %lld \n",v[t],v[t+n]);
ans=min(v[t],v[t+n]);
}
printf("%lld\n",ans);
}
return 0;
}

迪杰斯特拉+拆点 Deliver the Cake - HDU 6805的更多相关文章

  1. C#迪杰斯特拉算法

    C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...

  2. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  3. 【算法杂谈】LJX的迪杰斯特拉算法报告

    迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...

  4. C# 迪杰斯特拉算法 Dijkstra

    什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...

  5. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  6. 图-最短路径-Dijktra(迪杰斯特拉)算法

    1. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉算法于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始 ...

  7. 迪杰斯特拉算法——PAT 1003

    本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...

  8. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  9. 迪杰斯特拉(Java)

    public class Dijsktra { public static void main(String[] args) { Dijsktra d=new Dijsktra(); int[][] ...

随机推荐

  1. Python基础语法4-运算符

    Python提供了一系列丰富的运算符,包括:  Ø算术运算符  Ø赋值运算符  Ø关系运算符  Ø逻辑运算符 Ø位运算符  Ø三元运算符 Ø身份运算符 Ø成员运算符

  2. Android之旅2

    一.动静态调试四大组件 (一).activity 一个又一个的界面,需要在manifest里面注册 (二). (三).service (四).broadcast receiver 二.开始分析 1.先 ...

  3. Databricks 第8篇:把Azure Data Lake Storage Gen2 (ADLS Gen 2)挂载到DBFS

    DBFS使用dbutils实现存储服务的装载(mount.挂载),用户可以把Azure Data Lake Storage Gen2和Azure Blob Storage 账户装载到DBFS中.mou ...

  4. 2V转5V输出,2.4V转5V输出,DC-DC同步整流升压电路

    PW5100可以适用于2V转5V和2.4V转5V的应用电路中,PW5100是一颗DC-DC的同步升压转换器芯片. PW5100特点: 1, 低输入,宽范围:0.7V-5V 2, 输出电压固定,外围少: ...

  5. Nacos 服务配置中心

    1.因为项目是微服务分布式项目,每个微服务都需要用到配置中心,所以第一步我们先在common中添加相应的依赖 <dependency> <groupId>com.alibaba ...

  6. GlusterFS数据存储脑裂修复方案最全解析

    本文档介绍了glusterfs中可用于监视复制卷状态的heal info命令以及解决脑裂的方法 一. 概念解析 常见术语 名称 解释 Brick GlusterFS 的基本存储单元,由可信存储池中服务 ...

  7. Spark SQL如何选择join策略

    前言 众所周知,Catalyst Optimizer是Spark SQL的核心,它主要负责将SQL语句转换成最终的物理执行计划,在一定程度上决定了SQL执行的性能. Catalyst在由Optimiz ...

  8. Android字节码优化工具redex初探

    https://mp.weixin.qq.com/s/Og2TkGrZR490h9-KO23lmw 背景 apk瘦身和启动时间优化是移动端开发性能优化中经常被提到的两个问题.apk瘦身的常规做法有,s ...

  9. JVM 调优 内存调优 CPU 使用调优 锁竞争调优 I/O 调优

    Twitter 工程师谈 JVM 调优 2016年03月24日 10:22:30 wenniuwuren https://blog.csdn.net/wenniuwuren/article/detai ...

  10. 20201103gryz模拟赛解题报告

    写在前面 昨天忘写了来补上 T1位运算乱搞一会没搞出来, 打完T4floyd暴力分之后发现T2树状数组可以骗点分 打完T3暴力手模了一遍样例之后发现T3就是个线段树板子 最后就非常愉快的拿到175pt ...