这道题正解其实是LCT,然而貌似SPFA也可以成功水过,所以根本不知道LCT的我只能说SPFA了。

  这道题最大的限制是两种精灵就意味着一条道可能有两个权值,因此我们需要去将其中一个固定,然后再推另一个权值,也就是说,我们可以,枚举每一条边的a,然后只走a值不大于他的边。

  然而并没有那么容易,本题数据极大,这种算法一半分都拿不到,因此我们需要别的优化,首先,我们可以现将每个边按照a的大小进行排序,然后从小到大边枚举边加边,这时dis数组就不必去每次spfa都清空了,而且每次枚举边都可以在原来的图的基础上直接加边,且当前边一定都是能走的边,不必再算上那些不满足要求的边了,可以大大地优化是时间复杂度。

  

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<map>
 7 #include<queue>
 8 #include<string>
 9 #include<cmath>
10 using namespace std;
11 int n,m,zz,a[500005];
12 struct ro{
13     int to,from;
14     int next;
15     int a,b;
16 }road[2000005];
17 struct no{
18     int a,b,from,to;
19 }node[200004];
20 void build(int x,int y,int z,int zx)
21 {
22     zz++;
23     road[zz].from=x;
24     road[zz].to=y;
25     road[zz].next=a[x];
26     road[zz].a=z;
27     road[zz].b=zx;
28     a[x]=zz;
29 }
30 int dis[500005];
31 queue<int> q1;
32 bool rd[500005];
33 int ans=0x7fffffff;
34 void spfa(int x0,int y0,int z,int zx){
35     rd[x0]=rd[y0]=1;
36     q1.push(x0);
37     q1.push(y0);
38     while(!q1.empty())
39     {
40         int x=q1.front();
41         q1.pop();
42         rd[x]=0;
43         for(int i=a[x];i>0;i=road[i].next)
44         {
45             int y=road[i].to;
46
47             if(dis[y]>max(dis[x],road[i].b))
48             {
49                 dis[y]=max(dis[x],road[i].b);
50                 if(!rd[y])
51                 {
52                     q1.push(y);
53                     rd[y]=1;
54                 }
55             }
56         }
57     }
58     int an=0;
59     an=dis[n];
60     if(an!=dis[0]&&ans>an+z)
61         ans=an+z;
62 }
63 int px(no a,no b)
64 {
65     return a.a<b.a;
66 }
67 int main(){
68     memset(dis,0x7f,sizeof(dis));
69     scanf("%d%d",&n,&m);
70     for(int i=1;i<=m;i++)
71     {
72         int x,y,z,zx;
73         scanf("%d%d%d%d",&x,&y,&z,&zx);
74         node[i].a=z;
75         node[i].b=zx;
76         node[i].to=y;
77         node[i].from=x;
78     }
79     sort(node+1,node+m+1,px);
80     dis[1]=0,rd[1]=1;
81     q1.push(1);
82     for(int i=1;i<=m;i++)
83     {
84         int bj=i;
85         build(node[i].from,node[i].to,node[i].a,node[i].b);
86         build(node[i].to,node[i].from,node[i].a,node[i].b);
87         spfa(node[i].from,node[i].to,node[i].a,node[i].b);
88     }
89     if(ans==0x7fffffff) ans=-1;
90     printf("%d\n",ans);
91 //    while(1);
92     return 0;
93 }

View Code

转载于:https://www.cnblogs.com/liutianrui/p/7343818.html

[NOI2014]魔法森林题解相关推荐

  1. [LCT动态树] [NOI2014]魔法森林,[ZJOI2018]历史

    [NOI2014] 魔法森林 题目 按照aaa精灵从小到大排序 按顺序插入每一条边 加入第iii条边后的最小代价为a[i]a[i]a[i]加上从111到nnn的所有路径中最大bbb最小的路径代价 维护 ...

  2. 【bzoj3669】[Noi2014]魔法森林【LCT】

    [Noi2014]魔法森林 Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1 ...

  3. BZOJ 3669: [Noi2014]魔法森林( LCT )

    排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...

  4. loj2245 [NOI2014]魔法森林 LCT

    [NOI2014]魔法森林 链接 loj 思路 a排序,b做动态最小生成树. 把边拆成点就可以了. uoj98.也许lct复杂度写假了..越卡常,越慢 代码 #include <bits/std ...

  5. 神spfa [Noi2014]魔法森林

    问题 G: [Noi2014]魔法森林 时间限制: 30 Sec  内存限制: 512 MB 题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个 ...

  6. [BZOJ]3669: [Noi2014]魔法森林 lct

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  7. 【bzoj 3669】[Noi2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  8. 图论 BZOJ 3669 [Noi2014]魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

  9. 题解 P2387 【[NOI2014]魔法森林】

    感觉最近做的一些\(LCT\)的题目其实都是不断加边,判环,取较优者. 比如这道题,一句话题解就是按照边权\(A\)排序后用\(LCT\)维护边权\(B\)的最小生成树 比如最小生成树,它用\(LCT ...

最新文章

  1. android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!
  2. ACM入门之【字典树/Trie】
  3. spring架构初学者_完整的厨师和基础架构初学者指南
  4. gitlab创建分支上传文件_代码管理-gitlab使用方法建议
  5. 生成pdf设置中文字体出错 \simsun.ttc' with 'Identity-H' is not recognized或者type of font{0} is not recognized
  6. Shell 脚本:DDNS for aliyun
  7. iPaste:剪贴板界的一股清流
  8. 运放的原理、应用、参数和命名规则
  9. linux搭建raid5命令,命令行操作RAID5
  10. WPF DataGrid 获取选中 一行 或者 多行
  11. 2021,前端月薪30K已是白菜价?
  12. Beyond feelings的 introduction和 chapter1读后感
  13. 海老师的技术博客: OCA 考试 准备笔记(一): Java Building Blocks
  14. 解决引入JS中文乱码问题
  15. lpddr3 阻抗_lpddr3约束规则
  16. 攻防世界reverse——open-sourse(C语言)
  17. 荣耀9x是鸿蒙系统吗,好消息!荣耀9X年内将全部升级华为鸿蒙操作系统
  18. [Web]如何利用Boostrap框架搭建一个还可以的静态网站(五_子页_脱发指南)
  19. deletepod = restart pod?
  20. 水很深的深度学习--深度学习概述

热门文章

  1. 神经科学如何影响人工智能?看DeepMind在NeurIPS2020最新《神经科学人工智能》报告,126页ppt...
  2. 下一个十年的C位:物联网产业全景解析
  3. 密歇根大学28页最新《GANs生成式对抗网络综述:算法、理论与应用》最新论文,带你全面了解GAN技术趋势...
  4. 全球工业互联网十大最具成长性技术
  5. 语音助手再次敲响隐私保护警钟
  6. 面对大规模AI集成,企业为何迟迟犹豫?
  7. 谁说女生不适合当程序员?
  8. 10+小故事揭秘高频「操作系统面试题」
  9. 老码农揭开行业黑幕:如何编写无法维护的代码
  10. 《伟大的计算原理》一致谢