至死不用dijskstra系列2333,洛谷上T了一个点,开了O2才过
基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为0,表示免了这条边的边权,然后答案就是第0层的s到k层的t的最短路,因为0权边总是从上一层连到下一层,所以到达k层就表示走了k条0权边
这样的点数是nk的,不管是dijskstra还是spfa都跑不过
然后仔细观察这张图的特性,发现不同层之间的更新只有上一层通过0权边更新下一层,所以考虑单层更新,每一层都做一次spfa,然后跨层的时候用上一层跑过的最短路和0权边更新下一层
然后给spfa加一个SLF优化即可

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<ctime>
using namespace std;
const int N=50005,inf=1e9;
int n,m,k,h[N],cnt,dis[N],d[N];
bool v[N];
deque<int>q;
struct qwe
{int ne,no,to,va;
}e[N<<2];
int read()
{int r=0,f=1;char p=getchar();while(p>'9'||p<'0'){if(p=='-')f=-1;p=getchar();}while(p>='0'&&p<='9'){r=r*10+p-48;p=getchar();}return r*f;
}
inline void add(int u,int v,int w)
{cnt++;e[cnt].ne=h[u];e[cnt].no=u;e[cnt].to=v;e[cnt].va=w;h[u]=cnt;
}
void spfa()
{while(!q.empty()){int u=q.front();q.pop_front();v[u]=0;for(int i=h[u];i;i=e[i].ne)if(dis[e[i].to]>dis[u]+e[i].va){dis[e[i].to]=dis[u]+e[i].va;if(!v[e[i].to]){v[e[i].to]=1;if(!q.empty()&&dis[q.front()]>dis[e[i].to])q.push_front(e[i].to);elseq.push_back(e[i].to);}}}
}
int main()
{n=read(),m=read(),k=read();for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();add(x,y,z),add(y,x,z);// for(int j=0;j<=k;j++)// add(x+j*n,y+j*n,z),add(y+j*n,x+j*n,z);// for(int j=1;j<=k;j++)// add(x+(j-1)*n,y+j*n,0),add(y+(j-1)*n,x+j*n,0);}for(int i=1;i<=n;i++)dis[i]=inf;// clock_t st,ed;// st=clock();v[1]=1,dis[1]=0,q.push_back(1);spfa();for(int con=1;con<=k;con++){for(int i=1;i<=n;i++)d[i]=inf;v[1]=1,dis[1]=0,q.push_back(1);for(int i=1;i<=cnt;i++)if(d[e[i].to]>dis[e[i].no]){d[e[i].to]=dis[e[i].no];if(!v[e[i].to]){v[e[i].to]=1;if(!q.empty()&&d[q.front()]>d[e[i].to])q.push_front(e[i].to);elseq.push_back(e[i].to);}}for(int i=1;i<=n;i++)dis[i]=d[i];spfa();}// ed=clock();// cerr<<st<<" "<<ed<<" "<<ed-st<<endl;printf("%d\n",dis[n]);return 0;
}

转载于:https://www.cnblogs.com/lokiii/p/8975585.html

bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级【分层图+spfa】相关推荐

  1. 【BZOJ】1579: [Usaco2009 Feb]Revamping Trails 道路升级

    [算法]分层图最短路 [题解] 考虑k层一模一样的图,然后每个夹层都在每条边的位置新加从上一层跨越到下一层的边权为0的边,这样至多选择k条边置为0. 然后考虑方便的写法. SPFA 第一次SPFA计算 ...

  2. [Usaco2009 Feb]Revamping Trails 道路升级

    题目描述 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 < ...

  3. bzoj 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(DP)

    3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 353  Solved: 248 ...

  4. bzoj 3398 [Usaco2009 Feb]Bullcow 牡牛和牝牛——前缀和优化dp / 排列组合

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3398 好简单呀.而且是自己想出来的. dp[ i ]表示最后一个牡牛在 i 的方案数. 当前 ...

  5. bzoj 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛

    Description 约翰要带N(1≤N≤100000)只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站成一排.但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至 ...

  6. 【bzoj 2662】冻结(还是分层图+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2662 Description -- 例如,我们熟知的Cirno,她的冰冻魔法当然会有对应的 Spel ...

  7. 洛谷P2939 [USACO09FEB]改造路Revamping Trails(最短路)

    题目描述 Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= ...

  8. 洛谷 P2939 [USACO09FEB]改造路Revamping Trails

    洛谷 P2939 [USACO09FEB]改造路Revamping Trails Description 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到 ...

  9. 1578: [Usaco2009 Feb]Stock Market 股票市场

    1578: [Usaco2009 Feb]Stock Market 股票市场 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 414  Solved:  ...

最新文章

  1. Ubuntu12下挂载硬盘(9TB)
  2. list index out of range怎么解决_“卿卿我我”和“如胶似漆”英语怎么说?
  3. 记一次php手工注入(mysql)
  4. windows快捷键,photoshop快捷键,qq快捷键
  5. linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析
  6. linux下文件删除不了
  7. openwrt刷回原厂固件_小米路由器4刷breed, pandavan,openwrt
  8. 一位原码的乘法规则_原码一位乘法的实现算法
  9. K线技术指标实现详解—MA
  10. java se检查异常,JavaSE:异常(下)
  11. c语言常量要const,C语言常量-C语言const-嗨客网
  12. 二进制负数转换成十进制
  13. 计算机无法打开注册表,电脑无法打开注册表怎么办
  14. Doctype作用?标准模式与兼容模式各有什么区别?
  15. EDK2编译环境搭建、编译、在模拟器运行、在笔记本运行
  16. 【MWC 2022观察】华为绿色智简全光网:让联接释放数字化转型新动能
  17. 业务流程管理包括什么
  18. 导带电子浓度和价带空穴浓度
  19. 数字0是奇数还是偶数_C程序检查数字是偶数还是奇数
  20. SaaS企业如何降低客户流失率?

热门文章

  1. 一分钟了解react
  2. Python 中的黑暗角落(三):模块与包
  3. mediasoup 安裝
  4. mysql 升序_MySQL“自古以来”都有一个神秘的HANDLER命令
  5. 【Flink】 Flink与Kafka版本对应关系
  6. 【Elasticsearch】ELASTICSEARCH集群节点的扩容(移除与添加)
  7. 【Elasticsearch】Elasticsearch之集群角色类型
  8. Spark读取Hbase报错NoSuchMethodError: org.apache.hadoop.conf.Configuration.getPassword(Ljava/lang/String;
  9. mac下antlr4命令使用
  10. linux mysql 安装测试_linux下安装MySQL - 1583651986的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...