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 ...
随机推荐
- 关于shell脚本时遇value too great for base (error token is "08")
今天在书写一个定时cp脚本时遇到了一个问题,value too great for base (error token is "08") 在网上查看到原来是以0开头的数字 系统会默 ...
- 前端入门级之如何从零开始前端(估计要被人鄙视成LOW货了)入门篇
<!------------------------------------------------------基本说明开始----------------------------------- ...
- XMAL语法系列之-(2)---WPF控件继承图
WPF控件继承图 1 FrameworkElement 1.1 Panel(面板类元素) 1.1.1 Canvas 1.1.2 DockPanel 1.1.3 Grid 1.1.4 TabPanel ...
- WCF--提示:"未找到终结点。"
刚开始调用WCF的时候一直报错... ““System.ServiceModel.EndpointNotFoundException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进 ...
- EF方便的添加一条信息...
//刚开始通过EF添加数据都是这样的...↓ var db = new DBEntities() T_User t_userinfo = new T_User() { Type = "typ ...
- POJ 2155 Matrix
二维树状数组.... Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissio ...
- PHP函数preg_replace() 正则替换所有符合条件的字符串
PHP preg_replace() 正则替换,与JavaScript 正则替换不同,PHP preg_replace() 默认就是替换所有符号匹配条件的元素. preg_replace (正则表达式 ...
- java执行顺序
本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { Sys ...
- 【转】phpcms授课学习
来自:http://blog.csdn.net/yanhui_wei/article/category/1220735 <?php 思路: 一.目前在企业中使用比较多的cms内容管理有如下几种: ...
- Linux学习:用yum安装php,httpd,mysql
见鸟哥的linux私房菜电子版832页.