输入一个无向图<V,E>    V<=1e5, E<=3e5

现在另外给k条边(u=1,v=s[k],w=y[k])

问在不影响从结点1出发到所有结点的最短路的前提下,最多可以删除k条边的多少条

跑最短路的时候维护或者统计就好了

一开始用spfa.然后TLE 45...好久没写  Dij+堆优化   ...

p.s.优先队列默认大顶堆

Dij+堆优化   264ms

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <string>
using namespace std; #define ll long long
#define maxn 100010
#define maxm 700010 int head[maxn];
struct edge{
int v,w,nxt;
}e[maxm];
int E;
void init(){E=;memset(head,-,sizeof(head));}
void addedge(int u,int v,int w){
e[E].v=v,e[E].w=w,e[E].nxt=head[u];
head[u]=E++;
}
priority_queue<pair<ll,int> >que;
bool vis[maxn];
//ll d[maxn];
int main(){
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k)){
init();
for(int i=;i<m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
que.push(make_pair(0ll,));
for(int i=;i<k;++i){
int s,y;
scanf("%d%d",&s,&y);
que.push(make_pair(0ll-y,-s));
}
memset(vis,false,sizeof(vis));
int ans=;
while(!que.empty()){
pair<ll,int> tmp = que.top();que.pop();
ll dis = -tmp.first;
int u = tmp.second;
if(u<){
u=-u;
if(vis[u])++ans;
}
if(vis[u]) continue;
vis[u]=true;
//d[u] = dis;
for(int i=head[u];i!=-;i=e[i].nxt)
if(vis[e[i].v]==false)
que.push(make_pair( -dis-e[i].w, e[i].v));
}
printf("%d\n",ans);
}
return ;
}

spfa  TLE 45

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <string>
using namespace std; #define ll long long
#define maxn 100010
#define maxm 700010 int head[maxn];
struct edge{
int v,w,nxt;
int k;
}e[maxm];
int E;
void init(){E=;memset(head,-,sizeof(head));}
void addedge(int u,int v,int w,int kind){
e[E].v=v,e[E].w=w,e[E].nxt=head[u];
e[E].k = kind;
head[u]=E++;
}
int q[maxn];
bool inq[maxn];
bool bus[maxn];
ll dis[maxn];
void spfa(){
int hd=,tl=;
q[tl++]=;
memset(dis,0x3f,sizeof(dis));
dis[]=;
memset(inq,false,sizeof(inq));
inq[]=true;
memset(bus,false,sizeof(bus));
while(hd!=tl){
int u = q[hd++];
if(hd==maxn)hd=;
inq[u] = false;
for(int i=head[u];i!=-;i=e[i].nxt){
int v = e[i].v, w = e[i].w, k = e[i].k;
if(dis[u]+w < dis[v]){
dis[v] = dis[u]+w;
bus[v] = false;
if(k==) bus[v]=true;
if(inq[v]==false){
inq[v]=true;
q[tl++]=v;
if(tl==maxn)tl=;
}
}else if(dis[u]+w == dis[v]){
if(k==) bus[v]=true;
}
}
}
}
int si[],yi[];
int main(){
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k)){
init();
for(int i=;i<m;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w,);
addedge(v,u,w,);
}
for(int i=;i<k;++i){
scanf("%d%d",si+i,yi+i);
addedge(,si[i],yi[i],);
}
spfa();
int ans=;
for(int i=;i<k;++i){
int v = si[i];
if(dis[v] < yi[i]) ++ans;
else {
if(bus[v]==false)bus[v]=true;
else ++ans;
}
}
printf("%d\n",ans);
}
return ;
}

codeforces 449B Jzzhu and Cities (Dij+堆优化)的更多相关文章

  1. [Codeforces 449B] Jzzhu and Cities

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

  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 450B Jzzhu and Sequences (矩阵优化)

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

  4. dij+堆优化

    写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个: 香甜的奶油: #include<iostream> #include<cstdio> #include<cs ...

  5. 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

    首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...

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

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

  7. Codeforces449A Jzzhu and Chocolate && 449B Jzzhu and Cities

    CF挂0了,简直碉堡了.两道题都是正确的思路但是写残了.写个解题报告记录一下心路历程. A题问的是 一个n*m的方块的矩形上切k刀,最小的那一块最大可以是多少.不难发现如果纵向切k1刀,横向切k2刀, ...

  8. dijkstra最短路算法(堆优化)

    这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...

  9. Codeforces 449 B. Jzzhu and Cities

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

随机推荐

  1. JS抽奖功能代码

    HTML <label for="awardListDom">奖项列表</label><br> <input type="tex ...

  2. GOF业务场景的设计模式-----工厂模式

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 工厂方法模式 基本代码 interface IProduct { public void produ ...

  3. git checkout -b 的详细讲解

    创建分支: $ git branch mybranch 切换分支: $ git checkout mybranch 创建并切换分支: $ git checkout -b mybranch 更新mast ...

  4. SqlServer代理执行[分发清除: distribution] 无法删除快照文件

    每天偶尔检查数据库作业是否失败,发现有错误 select top 10 job_id,run_date,run_time,run_duration,step_name,message from  ms ...

  5. 绿书模拟day10 单词前缀

    [题目描述]一组单词是安全的,当且仅当不存在一个单词是另一个单词的前缀,这样才能保证数据不容易被误解,现在你手上有一个单词集合s,你需要计算有多少个自己是安全的.注意空集永远是安全的.[输入格式]第一 ...

  6. hdu4751 Divide Groups

    This year is the 60th anniversary of NJUST, and to make the celebration more colorful, Tom200 is goi ...

  7. Ruby学习之mixin

    直接上代码: module Action def jump @distance = rand(4) + 2 puts "I jumped forward #{@distance} feet! ...

  8. 一个C#的与web服务器交互的HttpClient类

    using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Net ...

  9. Java 反射的应用

    在学习反射之前,让我们先了解“类(Class)”.“方法”.“属性”.“类”都是名词,那么相应的在Java中会有这样一些特殊的类:“方法类(Method类)”.“属性类(Field类)”.“构造器类( ...

  10. 给UIView添加手势

    对于不能addTarget的UI对象,添加手势为他们带来了“福音”,以为UIView添加手势为例,揭开手势的面目. 1,创建一个view先, UIView * jrView=[[UIViewalloc ...