参考:https://blog.csdn.net/corncsd/article/details/38235973

传送门:http://codeforces.com/problemset/problem/450/D

题意:

有N个地方,M条线路,K条火车路(从1出发)。最多删掉多少火车路使1到每个点的最短路不变。

思路:

  用dijkstra的思路,优先队列每次找出d最小的。先用火车路更新最小的d。当u的最短路确定的时候,若还是那个火车路,没有被别的路更新,说明这条火车路不能删,若这条路已经被更新过,说明火车路能删。

  怎么判断一个点有没有被更新过呢,这里有个巧妙的方法,一开始把节点编号的负值加到优先队列中,如果最后确定最短路的时候还是负值说明没有被更新过。这个巧妙点还在于,如果存在两个的 first 负值相同,那么,编号为正的一定排在前面,就是说普通路的优先级会比铁路的高;

  有一点要注意,更新条件是d[v]>=d[u]+w,因为如果出现和火车路长度相同的路也要更新,因为这样也可以把火车路删掉。

  把d加入队列的时候可以加d的负值,因为默认的优先队列是先pop大的,负的最大就是正的最小。

ac代码:

#include <iostream>
#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define pb push_back
typedef long long ll;
const ll INF = 1e18+;
const int maxn = 1e5+;
ll n, m, k;
ll dis[maxn];
bool vis[maxn],vv[maxn];
vector< pair<ll, ll > >mp[maxn];
priority_queue< pair<ll ,ll > >q;
int main(){
scanf("%lld%lld%lld",&n,&m,&k);
memset(vv,,sizeof(vv));
for(int i=; i<=m; i++)
{
ll u, v;
ll c;
scanf("%lld%lld%lld",&u,&v,&c);
mp[u].pb(make_pair(v,c));
mp[v].pb(make_pair(u,c));
}
for(int i=; i<=n; i++)
dis[i] = INF, vis[i]=false;
for(int i=; i<=k; i++)
{
ll a;
ll b;
scanf("%lld%lld",&a,&b);
dis[a] = min(dis[a],b);
q.push(make_pair(-b,-a));
}
ll ans = ;
dis[] = ;
// vis[1] = true;
q.push(make_pair( , ));
while( !q.empty() )
{
ll v = q.top().second;
q.pop();
if(v<)
{
v = -v;
if(vis[v]) ans++;
}
if(vis[v])continue;
vis[v]=;
for(int i = ; i < mp[v].size(); i++)
{
ll tmp = mp[v][i].first;
ll tmpc = mp[v][i].second; if( dis[tmp] >= dis[v] + tmpc )
{
dis[tmp] = dis[v] + tmpc;
q.push(make_pair(-1ll*dis[tmp], tmp));
}
}
}
printf("%lld\n",ans);
return ;
}

Codeforces-450D-Jzzhu and Cities+dji的更多相关文章

  1. Codeforces 450D Jzzhu and Cities [heap优化dij]

    #include<bits/stdc++.h> #define MAXN 100050 #define MAXM 900000 using namespace std; struct st ...

  2. Codeforces C. Jzzhu and Cities(dijkstra最短路)

    题目描述: Jzzhu and Cities time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  3. [Codeforces 449B] Jzzhu and Cities

    [题目链接] https://codeforces.com/contest/449/problem/B [算法] 最短路 时间复杂度 : O(N ^ 2) [代码] #include<bits/ ...

  4. codeforces 449B Jzzhu and Cities (Dij+堆优化)

    输入一个无向图<V,E>    V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...

  5. Codeforces 450D:Jzzhu and Cities(最短路,dijkstra)

    D. Jzzhu and Cities time limit per test: 2 seconds memory limit per test: 256 megabytes input: stand ...

  6. Codeforces Round #257 (Div. 2) D题:Jzzhu and Cities 删特殊边的最短路

    D. Jzzhu and Cities time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces 449 B. Jzzhu and Cities

    堆优化dijkstra,假设哪条铁路能够被更新,就把相应铁路删除. B. Jzzhu and Cities time limit per test 2 seconds memory limit per ...

  8. CF449B Jzzhu and Cities (最短路)

    CF449B CF450D http://codeforces.com/contest/450/problem/D http://codeforces.com/contest/449/problem/ ...

  9. CodeForces 450B Jzzhu and Sequences (矩阵优化)

    CodeForces 450B Jzzhu and Sequences (矩阵优化) Description Jzzhu has invented a kind of sequences, they ...

  10. CF449B Jzzhu and Cities 迪杰斯特拉最短路算法

    CF449B Jzzhu and Cities 其实这一道题并不是很难,只是一个最短路而已,请继续看我的题解吧~(^▽^) AC代码: #include<bits/stdc++.h> #d ...

随机推荐

  1. 二进制文件安装k8s所需要的证书服务

    利用二进制文件安装etcd所需要的证书服务 CFSSL是CloudFlare开源的一款PKI/TLS工具. CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API ...

  2. ElasticSearch6.x版本聚合分析整理

    ElasticSearch6.x版本聚合分析整理 ES将聚合分析主要分为如下4类 Bucket,分桶类型,类似SQL中的GROUP BY语法 Metric,指标分析类型,如计算最大值 , 最小值,平均 ...

  3. Spring条件注解@Conditional

    @Conditional是Spring4新提供的注解,它的作用是根据某个条件创建特定的Bean,通过实现Condition接口,并重写matches接口来构造判断条件.总的来说,就是根据特定条件来控制 ...

  4. golang const 内itoa 用法详解及优劣分析

    首先itoa 是什么 const 内的 iota是golang语言的常量计数器,只能在常量的表达式中使用,,即const内. iota在const关键字出现时将被重置为0(const内部的第一行之前) ...

  5. 开发一个Spring Boot Starter!

    在上一篇文章中,我们已经了解了一个starter实现自动配置的基本流程,在这一小结我们将复现上一过程,实现一个自定义的starter. 先来分析starter的需求: 在项目中添加自定义的starte ...

  6. 自定义ItemToggleView

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  7. 【Java例题】2.8 解一元二次方程

    8.解一元二次方程. 输入一元二次方程的a,b,c三个系数,解一元二次方程 ax^2+bx+c=0,输出两个根 package study; import java.util.Scanner; pub ...

  8. 自定义FutureTask实现

    FutureTask FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果.通过get()方法来获取异步任务的 ...

  9. APP手机商城系统选择,混合开发与原生开发哪个好?

    关于手机APP开发用混合还是原生现在说法不一,有说混合开发好:时间短.费用低.效果也不错,有说原生开发好,原生APP在性能方面比较好.而商城系统中的手机APP用混合开发还是原生开发比较好呢? 最近我参 ...

  10. 利用SSH端口转发实现远程访问内网主机远程桌面(一) 建立SSH转发

    近期家里更换了移动的宽带,拨号后拿到的是10开头的内网IP,就不能像之前一样通过路由器的端口映射实现从外网访问主机的远程桌面.这种情况下可以利用一台具有公网IP的服务器充当中转,利用SSH的隧道转发功 ...