本题思路:主要是建图比较麻烦,因为结点可以在层与层之间走动,也可以在边上进行走动,所以主要就是需要找到一个将结点和层统一化处理的方法。

所以我们就可以对于存在边的结点建边,层与层之间如果层数相差一也建一条权值为c的边,相同层数之间的也建一条权值为零的边,接着Dijkstra即可。

  参考代码:spfa超时了,所以就改成了Dijkstra。

 #include <cstdio>
#include <cstring>
#include <queue>
using namespace std; const int maxn = 5e5, INF = 0x3f3f3f3f;
int n, m, c, Case = , num;
int dist[maxn], layer[maxn], head[maxn];
struct node {
int to, cost, Next;
} edge[maxn];
bool vis[maxn]; void addedge(int u, int v, int w) {
edge[num].to = v;
edge[num].Next = head[u];
edge[num].cost = w;
head[u] = num ++;
} // void Spfa() {
// for(int i = 1; i <= num; i ++)
// dist[i] = (i == 1 ? 0 : INF);
// memset(vis, false, sizeof vis);
// queue <int> Q;
// Q.push(1);
// vis[1] = true;
// while(!Q.empty()) {
// int u = Q.front();
// Q.pop();
// for(int k = head[u]; k != - 1; k = edge[k].Next) {
// int v = edge[k].to;
// if(dist[v] > dist[u] + edge[k].cost) {
// dist[v] = dist[u] + edge[k].cost;
// if(!vis[v])Q.push(v);
// }
// }
// }
// } struct Rule {
bool operator () (int a,int b) const {
return dist[a] > dist[b];
}
};
void dijkstra(int s) {
fill(dist, dist + num, INF);
priority_queue<int, vector<int>, Rule> q;
dist[s] = ;
q.push(s);
while(!q.empty()) {
int u = q.top(); q.pop();
for(int k = head[u]; k != -; k = edge[k].Next) {
int v = edge[k].to;
if(dist[v] > dist[u] + edge[k].cost) {
dist[v] = dist[u] + edge[k].cost;
q.push(v);
} }
}
} int main () {
int t, u, v, cost;
scanf("%d", &t);
while(t --) {
scanf("%d %d %d", &n, &m, &c);
num = ;
memset(head, -, sizeof head);
memset(layer, , sizeof layer);
for(int i = ; i <= n; i ++) {
scanf("%d", &u);
layer[i] = u;
addedge(i, n + * u - , );
addedge(n + * u, i, );
vis[u] = true;
}
for(int i = ; i < n; i ++) {
if(vis[i] && vis[i + ]) {
addedge(n + * i - , n + * (i + ), c);
addedge(n + * (i + ) - , n + * i, c);
}
}
for(int i = ; i < m; i ++) {
scanf("%d %d %d", &u, &v, &cost);
addedge(u, v, cost);
addedge(v, u, cost);
}
// Spfa();
dijkstra();
if(dist[n] == INF || n == )
printf("Case #%d: -1\n", Case++);
else
printf("Case #%d: %d\n", Case++, dist[n]);
}
return ;
}

HDU-4725.TheShortestPathinNyaGraph(最短路 + 建图)的更多相关文章

  1. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

  2. hdu 4725 The Shortest Path in Nya Graph (最短路+建图)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  3. hdu 5294 Tricks Device 最短路建图+最小割

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...

  4. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  5. hdu4725 The Shortest Path in Nya Graph【最短路+建图】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297574.html      ---by 墨染之樱花 题目链接:http://acm.hdu ...

  6. hdu 4444 Walk (离散化+建图+bfs+三维判重 好题)

    Walk Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  7. Codeforces 938D. Buy a Ticket (最短路+建图)

    <题目链接> 题目大意: 有n座城市,每一个城市都有一个听演唱会的价格,这n座城市由m条无向边连接,每天变都有其对应的边权.现在要求出每个城市的人,看一场演唱会的最小价值(总共花费的价值= ...

  8. Food HDU - 4292 网络流 拆点建图

    http://acm.hdu.edu.cn/showproblem.php?pid=4292 给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料 写的时候一共用了2种 ...

  9. HDU5521-最短路-建图

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. 为WebService添加身份验证的两种方法

    方法一:SoapHeader 辅助类:MySoapHeader //SoapHeader 添加引用 using System.Web.Services.Protocols; #region 配置登录标 ...

  2. java中的可释放资源定义,类似c#中的using

    public static class FileDuplicator implements AutoCloseable { Scanner in = null; PrintWriter out = n ...

  3. Game Physics Cookbook (Gabor Szauer 著)

    Chapter1: Vectors Chapter2: Matrices Chapter3: Matrix Transformations Chapter4: 2D Primitive Shapes ...

  4. Java面试题 corejava(二)

    65.JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try 块中可以抛出异常吗?[基础] 答:Java 通过面向对象的方法进行 ...

  5. Python字符串列表元祖字典的公共方法

    运算符 运算符 Python 表达式 结果 描述 支持的数据类型 + [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串.列表.元组 * 'Hi!' * 4 ['Hi!', 'Hi ...

  6. flask-appbuilder +echarts 展示数据笔记

    pip install flask-appbuilder fabmanager create-app cd newapp fabmanager create-admin fabmanager run ...

  7. 为嵌入式mplayer移植添加ALSA音频驱动(全志V3s荔枝派zero)

    首先准备mplayer和alsa_lib,我的是bulidroot添加后编译自动下载的,版本分别是alsa-lib-1.1.4.1和mplayer-1.3.0. 首先编译alsa_lib: ./con ...

  8. python http请求及多线程应用

    目录 概述 tomorrow包准备 运行环境遇到的问题 其他尝试未果 概述 今天, 使用python3 模拟下发包, http get 请求, 然后 采用tomorrow 多线程. 代码如下: # c ...

  9. oracle体系结构理解

    体系结构相关内容每次看遍书,过段时间就忘了..无奈用自己理解的方式记录之. 1.commit与写盘与否没有关系,也就是说修改数据(insert update delete)后并提交数据,这条被修改的数 ...

  10. VMware Workstation 11 搭建windows server 2012 之sql server 2012集群常见问题整理

    1.windows server 2012内置支持iSCSI发起程序无需额外安装,iSCSI Software Target 可作为“文件和存储服务”角色下的内置功能使用 2.拷贝虚拟机的文件加入域时 ...