题意:询问单源最短路径,每条边有一个颜色,要求路径上相邻边的颜色不能相同,无重边且边权为正。

题解:因为路径的合法性和边的颜色有关,

所以在做spfa的时候,把丢到队列中去,松弛的时候注意判断一下颜色,d数组表示到这条边的出点v的距离。

期望复杂度是O(km),k是边入队次数,m是边数。最后根据边来松弛顶点,O(m),总复杂度是O(km+m)。

一开始想的Dijkstra(看到边权为正。。),存点和之前边的颜色每次更新的时候判断来的那个点的颜色和当前边的颜色是否一样,WA了,很快我就意识到,入点不能只保存最短路径的颜色c1,如果边的颜色和c1一样,那么会判成路径不合法,但是实际上可能还存在一条次短路径且颜色和c1不等。因此每个点只需保存两个信息。

#include<cstdio>
#include <queue>
#include<cstring> using namespace std;
typedef long long ll;
#define mins(s,v) if(s>v) s = v const int maxn = 1e5+;
const ll INF = 0x7f7f7f7f7f7f7f7fLL;
int head[maxn],nxt[maxn],to[maxn],col[maxn],wei[maxn];
int ecnt; ll d[maxn];//edge
ll d2[maxn];//vex
int n,m,C,q;
int s,t; bool vis[maxn]; void spfa()
{
memset(d,0x7f,sizeof(ll)*m);
memset(vis,,sizeof(vis));
queue<int> q;
for(int i = head[s]; ~i ; i = nxt[i] ){
q.push(i); vis[i] = true; d[i] = wei[i];
} while(q.size()){
int e = q.front(); q.pop(); vis[e] = false;
for(int i = head[to[e]]; ~i; i = nxt[i]) {
if(col[e] != col[i] && wei[i]+d[e] < d[i] ){
d[i] = wei[i] + d[e];
if(!vis[i]) { q.push(i); vis[i] = true; }
} }
}
memset(d2+,0x7f,sizeof(ll)*n);
d2[s] = ;
for(int i = ; i < m; i++)
mins(d2[to[i]],d[i]);
} inline void AddEdge(int u,int v,int w,int c)
{
to[ecnt] = v;
wei[ecnt] = w;
col[ecnt] = c;
nxt[ecnt] = head[u];
head[u] = ecnt++;
} int main()
{
scanf("%d%d%d",&n,&m,&C);
memset(head+,-,sizeof(int)*n); for(int i = ; i < m; i++){
int u,v,c,w;
scanf("%d%d%d%d",&u,&v,&w,&c);
AddEdge(u,v,w,c);
}
scanf("%d%d",&s,&q); spfa();
for(int i = ; i < q; i++){
scanf("%d",&t);
printf("%I64d\n",d2[t]!=INF?d2[t]:-);
}
return ;
}

codeforce Gym 100570B ShortestPath Query (最短路SPFA)的更多相关文章

  1. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  2. L - Subway(最短路spfa)

    L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...

  3. Gym - 100570B :ShortestPath Query(SPFA及其优化)

    题意:给定N点M边的有向图,每条边有距离和颜色,一条有效路径上不能有相邻的边颜色相同.现在给定起点S,多次讯问S到点X的最短有效距离. TLE思路:用二维状态dis(u,c)表示起点到u,最后一条边的 ...

  4. LightOJ 1074 Extended Traffic (最短路spfa+标记负环点)

    Extended Traffic 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/O Description Dhaka city ...

  5. 30-算法训练 最短路 spfa

    http://lx.lanqiao.cn/problem.page?gpid=T15 算法训练 最短路   时间限制:1.0s   内存限制:256.0MB        问题描述 给定一个n个顶点, ...

  6. ACM/ICPC 之 最短路-SPFA+正逆邻接表(POJ1511(ZOJ2008))

    求单源最短路到其余各点,然后返回源点的总最短路长,以构造邻接表的方法不同分为两种解法. POJ1511(ZOJ2008)-Invitation Cards 改变构造邻接表的方法后,分为两种解法 解法一 ...

  7. POJ 1847 Tram --set实现最短路SPFA

    题意很好懂,但是不好下手.这里可以把每个点编个号(1-25),看做一个点,然后能够到达即为其两个点的编号之间有边,形成一幅图,然后求最短路的问题.并且pre数组记录前驱节点,print_path()方 ...

  8. 【POJ】3255 Roadblocks(次短路+spfa)

    http://poj.org/problem?id=3255 同匈牙利游戏. 但是我发现了一个致命bug. 就是在匈牙利那篇,应该dis2单独if,而不是else if,因为dis2和dis1相对独立 ...

  9. 【wikioi】1269 匈牙利游戏(次短路+spfa)

    http://www.wikioi.com/problem/1269/ 噗,想不到.. 次短路就是在松弛的时候做下手脚. 设d1为最短路,d2为次短路 有 d1[v]>d1[u]+w(u, v) ...

随机推荐

  1. IE各栏的截图说明

    工具栏  包括  状态栏  命令栏   菜单栏   收藏栏 IE工具 > 工具栏  > 状态栏 有状态栏显示 无状态栏显示 菜单栏 快捷键  alt  可以快速展示  菜单栏    ,查看 ...

  2. php封装pdo操作数据的工具类

    <?php header("Content-Type:text/html;charset=utf-8"); class PdoMysql{ public static $co ...

  3. ASP.NET自定义控件组件开发

    ASP.NET的开发都是事件驱动的,现在我们就来为控件添加事件.在事件之前 对委托事件要要熟悉. 其实定义事件的步骤很简单: 1.声明一个委托. 2.定义一个携带事件信息的类. 3.定义事件 4.定义 ...

  4. tf.pad()

      说一下我理解的tf.pad(),先来看一下定义: def pad(tensor, paddings, mode="CONSTANT", name=None, constant_ ...

  5. Solr 6.7学习笔记(06)-- spell check

    拼写检查也是搜索引擎必备的功能.Solr中提供了SpellCheckComponent 来实现此功能.我看过<Solr In Action>,是基于Solr4.X版本的,那时Suggest ...

  6. 01.html5+phonegap跨平台移动应用开发

    一.html5+PhoneGap基础知识 (1)html5介绍 HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大 ...

  7. vuex初使用(写的当然是最简单的应用啦)

    关于vuex的简图 vuex文档:https://vuex.vuejs.org/zh-cn/installation.html 一:npm安装 npm install vuex --save 在mai ...

  8. virtualenv模块安装

    依赖包管理模块(virtualenv) virtualenv是Python的虚拟环境,可以在同一台PC隔离不同的python开发环境.virtualenv可以创建一个隔离的python环境(沙盒).使 ...

  9. redis 拒绝远程访问解决

    启动时报的警告: 1.Warning: no config file specified, using the default config. In order to specify a config ...

  10. Linux (Windows Linux子系统)

    Linux (Windows Linux子系统) 如果想体验Linux环境下开发和运行.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种 ...