参考: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. 机器学习经典分类算法 —— k-均值算法(附python实现代码及数据集)

    目录 工作原理 python实现 算法实战 对mnist数据集进行聚类 小结 附录 工作原理 聚类是一种无监督的学习,它将相似的对象归到同一个簇中.类似于全自动分类(自动的意思是连类别都是自动构建的) ...

  2. 在表格中添加text便加框

    private void createTableText(Table table) { TableEditor editor = new TableEditor(table); for (int i ...

  3. Python基础总结之初步认识---clsaa类(上)。第十四天开始(新手可相互督促)

    最近的类看着很疼,坚持就是胜利~~~ python中的类,什么是类?类是由属性和方法组成的.类中可能有很多属性,以及方法. 我们这样定义一个类: 前面是class关键字 后面school是一个类的名字 ...

  4. Fragment 使用详解

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

  5. JVM实战---类加载的过程

    任何程序都需要加载到内存才能与CPU进行交流 同理, 字节码.class文件同样需要加载到内存中,才可以实例化类 ClassLoader的使命就是提前加载.class 类文件到内存中 在加载类时,使用 ...

  6. 【TCP/IP】ICMP协议

    ICMP协议有两种报文: 1,查询报文 2,差错报文

  7. 编码规范 | Java函数优雅之道(下)

    上文背景 本文总结了一套与Java函数相关的编码规则,旨在给广大Java程序员一些编码建议,有助于大家编写出更优雅.更高质.更高效的代码. 内部函数参数尽量使用基础类型 案例一:内部函数参数尽量使用基 ...

  8. springboot整合websocket高级版

    目录 sockjs介绍 产生的原因 环境搭建 springboot整合sockjs 使用场景 聊天室开发 点对点通信 群聊 效果 总结 加入战队 微信公众号 上一章节我们说了websocket的优缺点 ...

  9. C++学习想法

    今天是周一,今天做早操的时候舍友说准备买一本C++基础的书.我觉得这样的想法很好,突然想到自己最近几天因为自己私人原因事情很忙,蛋这不能成为我不学C++的理由.所以我在这规划了我这一周的学习进程.首先 ...

  10. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...