也是给这个题目跪了一天。。。时间不多了,也不多讲

首先要用 nlogn的优先队列dijstla来求最短路,n^2的会超时,不过发现SPFA好像也可以过,他的复杂度应该介于NlogN和N^2之间。

然后统计可以去掉的铁路条数才是难点

一开始我采用边跑最短路边标记,最后再统计,发现漏了好多情况,自己想了个数据都过不了,即如果当前的铁道和另外一个铁路都能访问该点,实际应该去掉当前的这个铁路,但我这种方案根本探测不出来这种情况

最好的方法就是边跑最短路边探测了,聪哥就是这样做,然后我还是谨慎了些,采用数组记录,但是我坑在一个地方,就是优先队列的时候,我调用外部的数组值作为比较函数的变量,然后总是过不了第六组数据,最后发现是这个问题。真是坑死人,优先队列的比较函数一定只能调用内部值,千万别调外部的,血泪教训啊

还有个坑的地方就是我用的邻接表是先访问火车路,再访问公路,不像聪哥是先访问公路,后来铁路一上来,直接比较就行了。。。我这样的,有可能铁路边一出来就变成了最短边,但其实还有可能公路能访问到他,距离相等的公路,那么这个铁边就要去掉了,所以在里面孩子就算被vis了,也特判一下是不是铁路边以及距离相等。

有很多废弃边,尤其是连接一个点可能有多条铁路,在读入数据的时候,就处理掉这些,只留下一个边,这些边留下不仅增加复杂度,还可能造成错误,因为不好判断

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define LL __int64
using namespace std;
int n,m,k;
const int N = 9*100000+80;
int u[N],v[N],nt[N],flag[N],ft[N/8];
__int64 e[N];
__int64 d[N/8];
const LL INF =1LL<<62;
int vis[N/8];
int inq[N/8];
int cnt;
int isq[N/8];
struct node
{
int x,val;
bool operator < (const node& rhs) const{
return val>rhs.val;
}
};
void add(int a,int b,int c,int f)
{
u[cnt]=a;
v[cnt]=b;
e[cnt]=(LL)c;
flag[cnt]=f;
nt[cnt]=ft[a];
ft[a]=cnt++;
}
priority_queue<node> q;
void dijstla()
{
while (!q.empty()) q.pop();
d[1]=0;
q.push((node){1,0});
while (!q.empty())
{
node tmp=q.top();
q.pop();
int ux=tmp.x;
if (vis[ux]) continue;
vis[ux]=1;
isq[ux]=0;
for (int i=ft[ux];i!=-1;i=nt[i]){
int vx=v[i];
if (d[vx]>d[ux]+e[i]){
if (inq[vx]>0 && flag[i]==0 && ((d[ux]+e[i])<=inq[vx])){
inq[vx]=0;
}
d[vx]=d[ux]+e[i];
//if (isq[vx]) continue;
// else {
q.push((node){vx,d[vx]});
//isq[vx]=1;
// }
}
else
if (d[vx]==d[ux]+e[i])
{
if (flag[i]==0){
inq[vx]=0;
}
}
else
if (flag[i]==1){
inq[vx]=0;
}
}
}
}
int main()
{
int a,b,c;
while (scanf("%d%d%d",&n,&m,&k)!=EOF)
{
int ans=0;
cnt=0;
for (int i=0;i<=n;i++){
ft[i]=-1;
d[i]=INF;
vis[i]=0;
inq[i]=-1;
isq[i]=0;
}
for (int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c,0);
add(b,a,c,0);
}
int tmp=0;
for (int i=0;i<k;i++){
scanf("%d%d",&a,&b);
if (inq[a]==-1){
inq[a]=b;
}
else {
ans++;
if (inq[a]>b) inq[a]=b;
}
}
for (int i=2;i<=n;i++){
if (inq[i]>0){
add(1,i,inq[i],1);
}
}
dijstla();
for (int i=ft[1];i!=-1;i=nt[i]){
int nx=v[i];
if (flag[i]==1){
if (inq[nx]==0){
ans++;
}
else
if (inq[nx]>0)
{
if (d[nx]<inq[nx]){
ans++;
}
}
}
}
printf("%d\n",ans);
}
return 0;
}

  

Codeforces_449B 最短路+统计的更多相关文章

  1. poj 3463 最短路与次短路&&统计个数

    题意:求最短路和比最短路长度多1的次短路的个数 本来想图(有)方(模)便(版)用spfa的,结果妹纸要我看看dijkstra怎么解.... 写了三遍orz Ver1.0:堆优化+邻接表,WA //不能 ...

  2. 洛谷——P1144 最短路计数

    P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...

  3. [洛谷P1144][题解]最短路计数

    这道题可以用各种算法踩掉,我选择的是SPFA. 因为题目要求计数,所以我们开一个ans数组表示数量. 分两种情况讨论: 一:dis_v>dis_u+1 最短路被更新了,可以直接ans_v=ans ...

  4. poj 3463 Sightseeing(次短路+条数统计)

    /* 对dij的再一次理解 每个点依旧永久标记 只不过这里多搞一维 0 1 表示最短路还是次短路 然后更新次数相当于原来的两倍 更新的时候搞一下就好了 */ #include<iostream& ...

  5. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  6. Luogu P1608 路径统计 最短路计数

    颓了...重边导致我乖乖用邻接矩阵.... 好吧就是个最短路计数....如果更新时d[v]==d[u]+w[i],就可以接起来,把两个加在一起.. 如果d[v]>d[u]+w[i],那么c[v] ...

  7. luogu 1608 路径统计--最短路计数

    https://www.luogu.org/problemnew/show/P1608 题意https://www.cnblogs.com/rmy020718/p/9440588.html相似,建议还 ...

  8. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status] ...

  9. CF449B Jzzhu and Cities (最短路)

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

随机推荐

  1. 对象内置的方法/内置的 Symbol 值

    内置的 Symbol 值 除了定义自己使用的 Symbol 值以外,ES6 还提供了 11 个内置的 Symbol 值,指向语言内部使用的方法. Symbol.hasInstance 对象的Symbo ...

  2. arm linux 移植支持 HP打印机

    背景 由于业务需要,需要hi3531d主板上加入对于HP打印机的支持. 通过与产品经理,技术主管的沟通:通用支持是不现实的,只要求彩色打印,先不考虑打印机的价格,只要支持一款打印机即可. 注意: Li ...

  3. CodeForces - 869B The Eternal Immortality

    题意:已知a,b,求的最后一位. 分析: 1.若b-a>=5,则尾数一定为0,因为连续5个数的尾数要么同时包括一个5和一个偶数,要么包括一个0. 2.若b-a<5,直接暴力求即可. #in ...

  4. HiBench成长笔记——(1) HiBench概述

    测试分类 HiBench共计19个测试方向,可大致分为6个测试类别:分别是micro,ml(机器学习),sql,graph,websearch和streaming. 2.1 micro Benchma ...

  5. 原型与继承与class

    对象有属性(专业点叫静态属性)和方法(专业点叫静态方法)和原型属性和原型方法 除了系统自带的那么几百万个对象,我们自己写在js的创建的对象,自定义的对象,都来自对象的构造函数,用来构造对象的函数,叫做 ...

  6. C# 控件缩写规范

    标准控件缩写规范 类 型 前 缀 示 例 Adrotator adrt adrtTopAd BulletedList blst blstCity Button btn btnSubmit Calend ...

  7. LeetCode141 环形链表(Java—HashSet简单应用or双指针)

    题目: 判断给出的链表中是否存在环. 思路: 1. 遍历整个链表,将走过的节点的内存地址保存下来,如果再次走到同样的内存地址,说明链表中有环.时间复杂度为O(n). 2. 设置两个指针,fast指针每 ...

  8. Spring Aop 原理分析

    @EnableAspectJAutoProxy Aop功能开启注解 为容器中导入 @Import(AspectJAutoProxyRegistrar.class)组件,在其重写方法中为 ioc容器 注 ...

  9. 定义一个共享数据块DB1 在DB1中定义一个数组 用程序 访问数据里面的某一个成员或者地址连续的成员

    提纲 : 定义一个共享数据块 DB1 在DB1 中定义数组 用SFC21 实现 实现全部数组元素的赋一样的值 实现 给数组中的某一个元素赋值 实现 对数组中的全部元素赋值 实现将数组中的某个 或者 某 ...

  10. l5213. 玩筹码

    这道题本应该很简单的但是我把他复杂化了,所以没有在第一时间里A出来.我们来看看题目 看上去是不是很复杂,思路是有,但是,很难实现.我最开始的时候是认为有三种情况,左边筹码最多,右边筹码最多,中间筹码最 ...