HDU6386 Age of Moyu 最短路dijkstra+堆优化
这道题应该是比较明显的最短路变形了。一开始用了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+堆优化相关推荐
- poj1511 InvitationCards 最短路 Dijkstra堆优化
第一反应想到和 poj3268做法一样,先是从起点dj,然后将图反向,再次dj一次,求和即可.但是,数据O(n*n)过不去,所以需要使用dijkstra的堆优化! 淦,没用scanf结果超时了= = ...
- * poj 3159 Candies 最短路 dijkstra堆优化
题意: n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 Input: 输入包含单个测试用例.测试用例以两个整数n和m开头,分别 ...
- HDU ACM 3986 Harry Potter and the Final Battle(邻接表实现最短路dijkstra堆优化记录路径 + 枚举最短路上每条边)...
http://acm.hdu.edu.cn/showproblem.php?pid=3986 题意: 从起点1 到 终点n,删除图中任意一条边求最短路的最坏情况. n --表示有n个点 m --边数 ...
- A - Age of Moyu HDU - 6386(Dijkstra+堆优化)
要解决这道题,可以用dfs+bfs,但是我不会,所以我只会dijkstra算法: 要解决这道题必须明白迪杰斯特拉算法的核心思想,我是这样理解的: 我可以任意举例一个图: 比如这个图,那么求1-6的最短 ...
- dijkstra堆优化(multiset实现-大大减小代码量)
例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...
- HDU-6386 Age of Moyu (想法+迪杰斯特拉)
Age of Moyu 题目链接: Age of Moyu 题意 给你N个顶点,M条边,每条边都属于一个海贼,在从一个海贼的边到另一个海贼的边时需要交1点路费,如果还是同一个海贼,则不用交. 思路 现 ...
- dij算法堆优化_BZOJ 3040 最短路(road) 堆优化Dijkstra | 学步园
题目大意:最短路. 思路:最短路. 贴一份比较高效的堆优化Dij模板吧. CODE: #include #include #include #include #define _MAX 1000010 ...
- AcWing 850. Dijkstra求最短路 II(堆优化dijkstra)
题目链接 : 点击查看 题目描述 : 给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值. 请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点, ...
- 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化
今天的集训学习了最短路dijkstra的堆优化,把时间复杂度从朴素版的O()降至了O(n*logn+m). 首先,先上一段朴素版的代码. void dijkstra() {dist[1] = 0;fo ...
- * Dijkstra 堆优化
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Mashiro_ylb/article/ ...
最新文章
- ashx导出dataTable为Excel
- 利用统计滤波方法去除空中漂浮物 以及去噪
- eclipse安装m2e.sourcelookup插件debug第三方源码(spring)
- 《Windows 系列》- 修改hsot
- mysql amoeba 链接111,mycat1.4 amoeba3.0.5 mysql直连对照_mysql
- 二十一天学通C++之使用try/catch捕获异常
- 加速Web开发的9款知名HTML5框架
- IAR For ARM 7.8下载地址
- ctf.show misc入门 21~40
- C语言 推箱子游戏 地图编辑器(简单)
- 一花一世界,在微服务中定义边界
- 【生活感想】期末考试
- 网络名称以太网网络2/3修改成网络
- 初体验CSDN Chit GPT
- Halcon连接大恒相机
- 3.购买服务器并部署
- 电商平台数据查询工具(京东数据分析软件)
- 无线充电线圈绕制注意事项
- cryptography
- 春季三月各行业活动营销指南