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

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

所以在做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. 2. nmap扫描神器总结

    -----------------nmap(选项)(参数)------------------O:激活操作探测: -P0:值进行扫描,不ping主机: -PT:是同TCP的ping: -sV:探测服务 ...

  2. 简单的GTK窗体搭建

    #include<gtk/gtk.h> //必须引用gtk/gtk.h这个头文件 2 int main(int argc,char *argv[]) //标准c语言主函数的声明 3 { 4 ...

  3. 使用makefile编译多个文件(.c , .cpp , .h等)

    有时候我们要一次运行多个文件,这时候我们可以使用Makefile!!! ◊make是什么? make是一个命令工具,是一个解释makefile中指令的命令工具.它可以简化编译过程里面所下达的指令,当执 ...

  4. UGUI CanvasGroup

    说明,这种直接设置alpha的方法跟go的setActive(false)性能差不多,只少了激活和冻结冻结调用 http://blog.csdn.net/qq_28824335/article/det ...

  5. 浅谈Unity的渲染优化(1): 性能分析和瓶颈判断(上篇)

    http://www.taidous.com/article-667-1.html 前言 首先,这个系列文章做个大致的介绍,题目"浅谈Unity",因为公司和国内大部分3D手游开发 ...

  6. 【UVA - 136】Ugly Numbers(set)

    Ugly Numbers Descriptions: Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequ ...

  7. 1366 - Incorrect string value:'\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' a 错误修改

    把name的字符集修改成 utf8 ,然后把表关了从新打开,就可以了 如果还不行,就从新创表,在创表的时候修改name的字符集 如果还不行,就修改my.ini 它在你的mysql安装路径里 [mysq ...

  8. Composer的简单使用

    .前期准备: 1.下载安装包,https://getcomposer.org/download/ 2.在php.ini文档中打开extension=php_openssl.dll 3.下载php_ss ...

  9. input accept属性控制选择文件类型

    <form> <input type="file" name="pic" id="pic" accept="im ...

  10. .NET 基础 一步步 一幕幕[Winform应用程序]

    时隔半载,重回博客园,一切从头再来,今天只是开始,原谅我这一生放荡不羁爱自由. 进入今天得主题曲:Winform应用程序(简介) 1.      winform应用程序是一种智能客户端技术,我们可以使 ...