至死不用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. OSI七层模型中每层的协议及网络设备—Vecloud微云
  2. Windows服务安装卸载
  3. 单调队列优化和决策单调性优化
  4. java 类的执行顺序_Java中类的执行顺序
  5. LoRa、蓝牙、技术在电子显示牌上的应用
  6. Python 并行分布式框架 Celery
  7. HTTP协议 (七) Cookie
  8. Android开发笔记(十四)圆弧进度动画CircleAnimation
  9. ASP.NET Web API 配置 JSONP
  10. 有关二级菜单缓慢效果出现(transition)
  11. mysql主键外键_MySQL数据库的主键和外键详解3
  12. 计算机控制面板属性在哪里打开,win7如何打开系统属性面板|win7打开系统属性面板的方法...
  13. 图像处理之图像去雾中文综述性论文
  14. php取word表格一行内容,如何提取出word表格中的内容 值得一看
  15. 学计算机的新手用什么笔记本好一点,笔记本什么配置比较好 有什么推荐呢
  16. 5号字对应的数字字号_请问在WORD文档里,字体大小所对应的用数字表示是多少...
  17. Kotlin骚气写法 三
  18. 怎么看待员工上班迟到扣工资行为?程序员:加班补工资就行
  19. 宏任务和微任务的详解
  20. 时间管理——华为成功之宝

热门文章

  1. php2个栈写一个队列,【数据结构】栈面试题--两个栈实现一个队列
  2. python gil锁_python GIL锁
  3. 计算机怎么切换到音乐,电脑怎么换开关机背景音乐?电脑换开关机背景音乐的方法...
  4. Spring Boot @SpringApplicationConfiguration 不能导入
  5. 【Flink】Flink SQL 架构 以及 执行逻辑
  6. 95-10-200-启动-结尾
  7. 95-30-050-java.util-LinkedHashMap
  8. 自定义 Git - Git 钩子
  9. 95-080-058-源码-启动-启动taskexecutor
  10. 95-160-024-源码-DataStream-ConnectedStreams与union合并流