题面
一道最短路好题……
开始和喻队长讨论了一下,喻队长一眼切:枚举ai的上界MAX,每次把ai小于等于MAX的边加到图里,以bi为边权跑最短路。
但是,这样做是O(ai*m)的,妥妥TLE,于是我们想了一些鬼畜剪枝优化常数,然并卵……喻队长身先士卒(比喻队长带头,走在蒟蒻前面),交了一波,TLE60分。
后来,看了题解才发现这道题是SPFA的玄学用途——维护动态加边的图的最短路!只此一家,绝无仅有!走过路过千万不要错过!于是我们就可以不用打LCT来维护一棵最小生成树(正解)。
具体做法其实很简单,每次距离数组不清零,只把新加入的边的两端点入队。这样的复杂度就是O(m)的了(也许吧,毕竟SPFA太玄学了),因为最后加起来相当于对原图跑一遍SPFA。
%%%%%%%%%%%%%%%喻队长
     #include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=,M=,INF=;
int gi(){
int str=;char ch=getchar();
while(ch>'' || ch<'')ch=getchar();
while(ch>='' && ch<='')str=(str<<)+(str<<)+ch-,ch=getchar();
return str;
}
int n,m;
struct node{
int x,y,dis,dist;
bool operator <(const node &pp)const{
return dis<pp.dis;
}
}e[M];
int head[N],num=;
struct Lin{
int next,to,dis;
}a[M<<];
void init(int x,int y,int z){
a[++num].next=head[x];
a[num].to=y;a[num].dis=z;
head[x]=num;
}
void addedge(int x,int y,int z){
init(x,y,z);init(y,x,z);
}
int t=,sum=,q[N*],mod=N*,f[N],ans=(INF<<);bool vis[N],usd[M];
bool spfa(int lim){
int x,u,tmp;
while(t!=sum){
t++;if(t==mod)t-=mod;x=q[t];
for(int i=head[x];i;i=a[i].next){
u=a[i].to;tmp=a[i].dis>f[x]?a[i].dis:f[x];
if(tmp<f[u]){
f[u]=tmp;
if(!vis[u]){
vis[u]=true;
sum++;if(sum==mod)sum-=mod;q[sum]=u;
}
}
}
vis[x]=false;
}
if(f[n]==INF)return false;
ans=min(ans,f[n]+lim);
return true;
}
void build(int sta){
t=;sum=;
for(int i=sta;i<=m && e[i].dis==e[sta].dis;i++){
addedge(e[i].x,e[i].y,e[i].dist);
q[++sum]=e[i].x;q[++sum]=e[i].y;
vis[e[i].x]=true;vis[e[i].y]=true;
usd[i]=true;
}
}
void work(){
n=gi();m=gi();
for(int i=;i<=m;i++)
e[i].x=gi(),e[i].y=gi(),e[i].dis=gi(),e[i].dist=gi();
sort(e+,e+m+);
int limiter=e[m].dis;
memset(f,/,sizeof(f));
f[]=;
for(int i=;i<=m;i++){
if(usd[i])continue;
build(i);
spfa(e[i].dis);
}
if(ans==(INF<<))printf("-1\n");
else printf("%d\n",ans);
}
int main()
{
work();
return ;
}

喻队长的小常数代码,比某蒟蒻快一倍

最新文章

  1. php实现文件上传与下载(上)
  2. php 获取当前服务器 系统
  3. ORACLE10g数据库字符集设置和客户端字符集设置不一致问题
  4. OnItemSelectedListener事件与二级联动
  5. 如何查看Windows8.1计算机体验指数评分
  6. PHP 怎么随机获取数组里面的值
  7. ☀【CSS3】box-sizing
  8. [压缩解压缩] SharpZip--压缩、解压缩帮助类
  9. php 函数 array_slice
  10. delphi tidhttp 超时的解决方案
  11. Windows Phone 9再见了!
  12. [3] 微信公众号开发 - 结合UEditor实现图文消息群发功能
  13. 在引用阿里云库或其他库的时候,经常发生框架不兼容(原因是系统采用:Microsoft .NET Framework 4 Client Profile ),请改为Microsoft .NET Framework 4
  14. Satis搭建composer私有库(自定义下载目录)
  15. C++ Primer 笔记——嵌套类 局部类
  16. Cordova/Ionic开发的Android APP启用Chrome Inspect调试的方法
  17. chrome flash
  18. Python之Python 安装环境搭建
  19. C# 与 Java Rsa加密与解密互通
  20. openstack 的 lbaas 疑问

热门文章

  1. Java过滤HTML标签工具类
  2. C++ 用libcurl库进行http通讯网络编程 【转】
  3. SWF代码分析与破解之路 (YueTai VIP视频信息获取工具) Socket续篇
  4. iOS学习笔记12-网络(一)NSURLConnection
  5. jquery easyui 全部图标
  6. JavaScript的string方法(demo)
  7. Kubernetes对象之ReplicaSet
  8. Android组件系列----ContentProvider内容提供者【4】
  9. mac下执行文件出现Permission Denied的解决
  10. JavaScript通过正则随机生成电话号码