CF449B Jzzhu and Cities 迪杰斯特拉最短路算法
CF449B Jzzhu and Cities
其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^)
AC代码:
#include<bits/stdc++.h>
#define maxn 3000005
#define pa pair<long long,long long>
#define inf 1000000000000000000ll
using namespace std;
long long n,m,k;
struct edge{
long long val,to;
};
bool vis[maxn];
long long dis[maxn],mark[maxn];
priority_queue<pa,vector<pa>,greater<pa> > q;
vector<edge> e[maxn*3];
long long ans;
void dijkstra()
{
memset(vis,0,sizeof(vis));
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(vis[x])
continue;
vis[x]=1;
for(int i=0;i<e[x].size();i++){
int y=e[x][i].to;
if(dis[x]+e[x][i].val<=dis[y]){
if(mark[y]){
mark[y]=0;
}
if(dis[x]+e[x][i].val<dis[y]){
dis[y]=dis[x]+e[x][i].val;
q.push(make_pair(dis[y],y));
}
}
}
}
}
void addedge(long long x,long long y,long long v){
edge tmp;
tmp.to=y;
tmp.val=v;
e[x].push_back(tmp);
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=n;i++)
dis[i]=inf;
for(int i=1;i<=m;i++){
long long x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
addedge(x,y,z);
addedge(y,x,z);
}
for(int i=1;i<=k;i++){
long long y,z;
scanf("%lld%lld",&y,&z);
if(dis[y]>z)
{
dis[y]=z;
q.push(make_pair(z,y));
mark[y]=1;
}
}
dijkstra();
for(int i=1;i<=n;i++)
ans+=mark[i];
printf("%lld\n",k-ans);
}
详解
那么我们来简化一下题目的含义
就是说有n个城市
1号城市是起点(树的根)
有m条普通边
有k条特殊边
问最多能删掉多少条边,能使最短路径不变
那么我们就可以先把n+k条边跑一遍dijkstra
然后就求出来了每个城市之间的最短路
在跑最短路的过程中判断这k条特殊边是否去掉后不影响最短路
但是这个题还有一个很坑人的bug
就像样例2中的一样,那k条特殊边可能会重复
那其实我们只需要留下来一条最短的就行了
用这个最短的一条去构建最短路
剩下的就直接删掉了
最后只需要用总边数减去剩余的特殊边的数量就行啦!~
CF449B Jzzhu and Cities 迪杰斯特拉最短路算法的更多相关文章
- 最短路径之迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
- PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]
1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...
- hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- Bumped!【迪杰斯特拉消边、堆优化】
Bumped! 题目链接(点击) Peter returned from the recently held ACM ICPC World Finals only to find that his r ...
- C#迪杰斯特拉算法
C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
随机推荐
- H3C RIP可选配置
- jQuery 工具类函数-使用$.extend()扩展Object对象
除使用$.extend扩展工具函数外,还可以扩展原有的Object对象,在扩展对象时,两个对象将进行合并,当存在相同属性名时,后者将覆盖前者,调用格式为: $. extend (obj1,obj2,… ...
- Linux 内核总线属性
几乎 Linux 驱动模型中的每一层都提供一个添加属性的接口, 并且总线层不例外. bus_attribute 类型定义在 <linux/device.h> 如下: struct bus_ ...
- 2018-8-10-win10-uwp-修改Pivot-Header-颜色
title author date CreateTime categories win10 uwp 修改Pivot Header 颜色 lindexi 2018-08-10 19:17:19 +080 ...
- rabbitmq template发送的消息中,Date类型字段比当前时间晚了8小时
前言 前一阵开发过程遇到的问题,用的rabbitmq template发送消息,消息body里的时间是比当前时间少了8小时的,这种一看就是时区问题了. 就说说为什么出现吧. 之前的配置是这样的: @B ...
- vue-learning:14 - js - new Vue(options)中option
new Vue(options)中option 2019-4-14 Vue的核心是数据驱动,在template中实现视图逻辑,在javascript中实现业务逻辑.要通过模板template将数据显示 ...
- hibernate配置文件模板
hibernate.cfg.xml 配置文件模版: <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-config ...
- VRChat之blender教程
推荐先看:VRChat模型制作及上传总篇(包含总流程和所需插件):https://www.cnblogs.com/raitorei/p/12015876.html 0.设置中文,安装cat插件 注意 ...
- 第二阶段:4.商业需求文档MRD:2.PRD-功能详细说明
功能详细说明 功能一般分两类:1.通用性功能(导航,菜单项) 通过PRD让各个部门清楚的了解产品的各项功能构成.
- 泛型 List转换成DataTable
private DataTable listToDataTable<T>(List<T> ListItem) { //实列化DataTable对象 var dt = new D ...