这道题应该是比较明显的最短路变形了。一开始用了spfa,TLE了。。后来发现dijkstra+堆优化时间复杂度可以降到O(mlogm),改用这个算法就可以了,对应改下结构体和dijkstra函数。另外注意无向图加两次边,edge数组也要开两倍(我就一直WA在了这个点上QAQ...)

附上AC代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
typedef pair<int,int>pp;
#define mkp make_pair
#define pb push_back
const int INF=0x3f3f3f3f;const int MAXN=100005;
const int MAXM=200005;
int n,m;
struct Edge
{int to,next;int idc;
}edge[MAXM*2];//注意要乘2!
int head[MAXN],tot;
void init()
{memset(head,-1,sizeof(head));tot=0;
}
void addedge(int u,int v,int w)
{edge[tot].to=v;edge[tot].next=head[u];edge[tot].idc=w;head[u]=tot++;
}
struct qnode
{int v,c,w,pre;//顶点,权值号,dis[v],父节点qnode(int _v=0,int _c=0,int _w=0,int _pre=0): v(_v),c(_c),w(_w),pre(_pre) {}bool operator < (const qnode &r) const{return w>r.w;//注意是大于!}
};
bool vis[MAXN];
int dis[MAXN];
void dijkstra()
{memset(vis,false,sizeof(vis));memset(dis,INF,sizeof(dis));dis[1]=0;priority_queue<qnode>q;while(!q.empty())q.pop();q.push(qnode(1,-1,0,-1));qnode tmp;while(!q.empty()){tmp=q.top();q.pop();int u=tmp.v;if(u==n)return;if(vis[u])continue;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;if(v==tmp.pre)continue;int w=edge[i].idc;int cost=0;if(w!=tmp.c)cost++;if(!vis[v]&&dis[v]>dis[u]+cost){dis[v]=dis[u]+cost;q.push(qnode(v,w,dis[v],u));}}}
}int main()
{while(scanf("%d%d",&n,&m)==2){init();if(m==0){printf("-1\n");continue;}int u,v,w;for(int i=0;i<m;i++){scanf("%d%d%d",&u,&v,&w);addedge(u,v,w);addedge(v,u,w);}dijkstra();if(dis[n]==INF)printf("-1\n");elseprintf("%d\n",dis[n]);}return 0;
}

HDU6386 Age of Moyu 最短路dijkstra+堆优化相关推荐

  1. poj1511 InvitationCards 最短路 Dijkstra堆优化

    第一反应想到和 poj3268做法一样,先是从起点dj,然后将图反向,再次dj一次,求和即可.但是,数据O(n*n)过不去,所以需要使用dijkstra的堆优化! 淦,没用scanf结果超时了= = ...

  2. * poj 3159 Candies 最短路 dijkstra堆优化

    题意: n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 Input: 输入包含单个测试用例.测试用例以两个整数n和m开头,分别 ...

  3. HDU ACM 3986 Harry Potter and the Final Battle(邻接表实现最短路dijkstra堆优化记录路径 + 枚举最短路上每条边)...

    http://acm.hdu.edu.cn/showproblem.php?pid=3986 题意: 从起点1 到 终点n,删除图中任意一条边求最短路的最坏情况. n  --表示有n个点 m --边数 ...

  4. A - Age of Moyu HDU - 6386(Dijkstra+堆优化)

    要解决这道题,可以用dfs+bfs,但是我不会,所以我只会dijkstra算法: 要解决这道题必须明白迪杰斯特拉算法的核心思想,我是这样理解的: 我可以任意举例一个图: 比如这个图,那么求1-6的最短 ...

  5. dijkstra堆优化(multiset实现-大大减小代码量)

    例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...

  6. HDU-6386 Age of Moyu (想法+迪杰斯特拉)

    Age of Moyu 题目链接: Age of Moyu 题意 给你N个顶点,M条边,每条边都属于一个海贼,在从一个海贼的边到另一个海贼的边时需要交1点路费,如果还是同一个海贼,则不用交. 思路 现 ...

  7. dij算法堆优化_BZOJ 3040 最短路(road) 堆优化Dijkstra | 学步园

    题目大意:最短路. 思路:最短路. 贴一份比较高效的堆优化Dij模板吧. CODE: #include #include #include #include #define _MAX 1000010 ...

  8. AcWing 850. Dijkstra求最短路 II(堆优化dijkstra)

    题目链接 : 点击查看 题目描述 : 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点, ...

  9. 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化

    今天的集训学习了最短路dijkstra的堆优化,把时间复杂度从朴素版的O()降至了O(n*logn+m). 首先,先上一段朴素版的代码. void dijkstra() {dist[1] = 0;fo ...

  10. * Dijkstra 堆优化

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Mashiro_ylb/article/ ...

最新文章

  1. ashx导出dataTable为Excel
  2. 利用统计滤波方法去除空中漂浮物 以及去噪
  3. eclipse安装m2e.sourcelookup插件debug第三方源码(spring)
  4. 《Windows 系列》- 修改hsot
  5. mysql amoeba 链接111,mycat1.4 amoeba3.0.5 mysql直连对照_mysql
  6. 二十一天学通C++之使用try/catch捕获异常
  7. 加速Web开发的9款知名HTML5框架
  8. IAR For ARM 7.8下载地址
  9. ctf.show misc入门 21~40
  10. C语言 推箱子游戏 地图编辑器(简单)
  11. 一花一世界,在微服务中定义边界
  12. 【生活感想】期末考试
  13. 网络名称以太网网络2/3修改成网络
  14. 初体验CSDN Chit GPT
  15. Halcon连接大恒相机
  16. 3.购买服务器并部署
  17. 电商平台数据查询工具(京东数据分析软件)
  18. 无线充电线圈绕制注意事项
  19. cryptography
  20. 春季三月各行业活动营销指南

热门文章

  1. Vue2开关(Switch)
  2. 转载只因瑞思拜 eGuideDog 的光明之路
  3. 敏捷无敌之成长的烦恼(15)
  4. Cron表达式记录【应用场景】
  5. 植物大战僵尸新植物僵尸(上)
  6. map按value排序, oh my god
  7. 证监会对6宗内幕交易案件作出行政处罚 涉及现代制药等
  8. 查询手机号 IP地址信息的API接口整理
  9. 如何轻松打造一款免开发Zigbee温湿度传感器?
  10. 16S rDNA分析中的qiime脚本