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

所以我们就可以对于存在边的结点建边,层与层之间如果层数相差一也建一条权值为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. github/gitee使用办法

    github/gitee只要添加SSH公钥都是可以连接上的 比如把某个文件上传gitee 首先肯定要有权限    否则会一直提醒failed伤心心 接下来说常用语句 git config --list ...

  2. 二十一、springcloud(七)服务网关zuul

    1.简介 Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,在微服务架构中,后端 ...

  3. python 常用的模块

    面试的过程中经常被问到使用过那些python模块,然后我大脑就出现了一片空白各种模块一顿说,其实一点顺序也没有然后给面试官造成的印象就是自己是否真实的用到这些模块,所以总结下自己实际工作中常用的模块: ...

  4. LOJ 3057 「HNOI2019」校园旅行——BFS+图等价转化

    题目:https://loj.ac/problem/3057 想令 b[ i ][ j ] 表示两点是否可行,从可行的点对扩展.但不知道顺序,所以写了卡时间做数次 m2 迭代的算法,就是每次遍历所有不 ...

  5. 12月中旬项目中出现的几个bug解决方法的思考

    这周做的项目遇到2个费了很多时间才解决的bug,解决之后,发现根本问题并不是什么很难的技术难点,都是因为自己在写代码的过程中,思维不够清晰.还有一个需要再提高的地方就是解决问题的思维,如何快速定位到问 ...

  6. 数据恢复工具--extundelete的安装与使用

    1.extundelete的恢复原理 extundelete恢复文件时并不依赖特定文件格式,首先extundelete会通过文件系统的inode信息,来获得当前文件系统下所有文件的信息,包括存在的和已 ...

  7. [SQL]触发器把自增ID的值赋值给另外一个字段

    ALTER TRIGGER test_Rate ON dbo.tRate FOR insert AS declare @errno ) begin UPDATE dbo.tRate SET vcUpd ...

  8. struts设置开发者模式

    struts设置开发者模式 在使用ssh框架做项目时,struts.xml文件总要配置许多项功能,其中一个就是开发者模式: <constant name="struts.devMode ...

  9. python-web自动化-元素操作:windows窗口切换 / alert切换 / iframe切换

    1. windows窗口切换:切换到要操作的窗口 有多个窗口: 1. 触发新窗口的出现 2. 得知道新窗口是谁 -- 依据窗口的window_handle来识别窗口 3. 得到窗口的window_ha ...

  10. mysql5.7.18.1修改用户密码报错ERROR 1054 (42S22): Unknown column 'password' in 'field list'解决办法

    本意向修改一个用户的密码,网上搜到的命令为如下 mysql> update user set password=password(“新密码”) where user=”用户名”; 执行后报错 E ...