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 迪杰斯特拉最短路算法的更多相关文章

  1. 最短路径之迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  2. 最短路径 - 迪杰斯特拉(Dijkstra)算法

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

  3. 迪杰斯特拉算法——PAT 1003

    本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...

  4. 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 ...

  5. 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 ...

  6. Bumped!【迪杰斯特拉消边、堆优化】

    Bumped! 题目链接(点击) Peter returned from the recently held ACM ICPC World Finals only to find that his r ...

  7. C#迪杰斯特拉算法

    C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...

  8. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  9. 【算法杂谈】LJX的迪杰斯特拉算法报告

    迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...

随机推荐

  1. H3C 启动包过滤防火墙功能

  2. 第一种方式:cookie的优化与购物车实例

    一 Cookie 的优化 1.1 一般而言,我们设置cookie是在php中设置 例如: <?php setcookie('testKey1','hello world',0,'/'); //# ...

  3. tp框架使用心得(六)——分页查询

    http://baijiahao.baidu.com/s?id=1578482537511010805&wfr=spider&for=pc 在用thinkphp中,对于新手手册中还是有 ...

  4. UPC 2019年第二阶段我要变强个人训练赛第十六场

    传送门: [1]:UPC比赛场 [2]:UPC补题场 F.gu集合(数论) •题目描述 题目描述: Dew有一个长为n的集合S. 有一天,他想选k个不同的元素出来做游戏. 但是Dew只有两只手,所以他 ...

  5. linux虚拟机设置固定IP并实现联网,主机与虚拟机实现互ping

    ifconfig eth0 up 启用第一块网卡 onboot=yes 自动启动 service network restart 重启网络服务 使用虚拟机添加一块桥接网卡 cp eth0 eth1 复 ...

  6. linux 使用 ioctl 参数

    在看 scull 驱动的 ioctl 代码之前, 我们需要涉及的另一点是如何使用这个额外的参数. 如果它是一个整数, 就容易: 它可以直接使用. 如果它是一个指针, 但是, 必须小心些. 当用一个指针 ...

  7. E40笔记本无线网卡

    E40笔记本无线网卡详情 网卡名称 Intel(R) Dual Band Wireless-AC 3160 网卡厂商 英特尔 Mac地址 34:E6:AD: 规格 - 基本要素 状态 Launched ...

  8. blink接收器

    blink: [autorun] OPEN="AutoInst.exe"  [AskRebootTitle] Dlg1=System Settings Change Dlg2=št ...

  9. Vue CLI 创建项目

    使用命令创建VUE项目 运行以下命令[vue create [项目名]]来创建一个新项目: vue create hello-world 警告 如果你在 Windows 上通过 minTTY 使用 G ...

  10. python 练习题2

    # 习题1:# 设定一个用户名和密码,用户输入正确的用户名和密码,# 则显示登录成功,否则提示登录失败,用户最多失败3次,# 否则退出程序.username="test"passw ...