codeforces 449B Jzzhu and Cities (Dij+堆优化)
输入一个无向图<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+堆优化)的更多相关文章
- [Codeforces 449B] Jzzhu and Cities
[题目链接] https://codeforces.com/contest/449/problem/B [算法] 最短路 时间复杂度 : O(N ^ 2) [代码] #include<bits/ ...
- Codeforces C. Jzzhu and Cities(dijkstra最短路)
题目描述: Jzzhu and Cities time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- CodeForces 450B Jzzhu and Sequences (矩阵优化)
CodeForces 450B Jzzhu and Sequences (矩阵优化) Description Jzzhu has invented a kind of sequences, they ...
- dij+堆优化
写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个: 香甜的奶油: #include<iostream> #include<cstdio> #include<cs ...
- 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...
- Codeforces 450D Jzzhu and Cities [heap优化dij]
#include<bits/stdc++.h> #define MAXN 100050 #define MAXM 900000 using namespace std; struct st ...
- Codeforces449A Jzzhu and Chocolate && 449B Jzzhu and Cities
CF挂0了,简直碉堡了.两道题都是正确的思路但是写残了.写个解题报告记录一下心路历程. A题问的是 一个n*m的方块的矩形上切k刀,最小的那一块最大可以是多少.不难发现如果纵向切k1刀,横向切k2刀, ...
- dijkstra最短路算法(堆优化)
这个算法不能处理负边情况,有负边,请转到Floyd算法或SPFA算法(SPFA不能处理负环,但能判断负环) SPFA(SLF优化):https://www.cnblogs.com/yifan0305/ ...
- Codeforces 449 B. Jzzhu and Cities
堆优化dijkstra,假设哪条铁路能够被更新,就把相应铁路删除. B. Jzzhu and Cities time limit per test 2 seconds memory limit per ...
随机推荐
- hdu4939 Stupid Tower Defense (DP)
2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131 ...
- 关于Html编码问题,例如字符:·
我写的WCF服务突然报错了... 然后我发现传过来的字符不完整 {"完整":"尼古拉·奥斯特洛夫斯基的信息"} 然后传过来的是:{"完整": ...
- 用Javascript获取页面元素的位置
制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置. 下面的教程总结了Javascript在网页定位方面的相关知识. 一.网页的大小和浏览器窗口的大小 首先,要明确两个基本概念. 一张网页的 ...
- svg技术(可缩放矢量图形)介绍
公司里面的产品用图表的地方也比较多,作为平台维护的我,收到几次需求提的建议中包括图表美化的功能,要炫,要3d,立体感,功能要强大等到:平台现有控件都是用的一个开源flash,我对flash虽然会一点但 ...
- sql批量更换dedecms文章来源和作者
前面写了一篇修改dedecms默认文章来源 "未知"改为关键词,那个是修改以后发布的文章“来源”才会变成自己设定的关键词,如果修改之前已经有很多文章了,那些文章“来源”还是显示“未 ...
- vue.js 简单入门
转载自:http://blog.csdn.net/violetjack0808/article/details/51451672 <!DOCTYPE html> <html lang ...
- C语言中可变参数函数实现原理
C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...
- eclipse emacs
eclipse emacs 插件 http://www.mulgasoft.com/emacsplus eclipse字体设置: 一.把字体设置为Courier New 操作步骤:打开Elcipse ...
- windows server2012和win8安装.netframework3.5失败问题及解决方法
很多人安装windows server2012和Win8后都遇到了无法升级.NET Framework 3.5.1的问题,在线升级会遇到错误0x800F0906.这使得 91手机助手等很多软件无法运行 ...
- JavaScript中的跨域
跨域是什么 跨域就是指从一个域名的网页去请求另一个域名的资源,因为JavaScript同源策略的限制,资源无法获取.比如从www.baidu.com 页面去请求 www.google.com 的资源, ...