题目描述 Description

麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复。

因为她和他们不住在同一个城市,因此她开始准备她的长途旅行。

在这个国家中每两个城市之间最多只有一条路相通,并且我们知道从一个城市到另一个城市路上所需花费的时间。

麦克在车中无意中听到有一条路正在维修,并且那儿正堵车,但没听清楚到底是哪一条路。无论哪一条路正在维修,从玛丽卡所在的城市都能到达麦克所在的城市。

玛丽卡将只从不堵车的路上通过,并且她将按最短路线行车。麦克希望知道在最糟糕的情况下玛丽卡到达他所在的城市需要多长时间,这样他就能保证他的女朋友离开该城市足够远。

编写程序,帮助麦克找出玛丽卡按最短路线通过不堵车道路到达他所在城市所需的最长时间(用分钟表示)。

输入描述 Input Description
第一行有两个用空格隔开的数N和M,分别表示城市的数量以及城市间道路的数量。1≤N≤1000,1≤M≤N*(N-1)/2。城市用数字1至N标识,麦克在城市1中,玛丽卡在城市N中。

接下来的M行中每行包含三个用空格隔开的数A,B和V。其中1≤A,B≤N,1≤V≤1000。这些数字表示在A和城市B中间有一条双行道,并且在V分钟内是就能通过。

输出描述 Output Description
输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。

样例输入 Sample Input
5 7

1 2 8

1 4 10

2 3 9

2 4 10

2 5 1

3 4 7

3 5 10

样例输出 Sample Output
27

 时间限制: 2 s
 空间限制: 128000 KB
题目来源:codevs
   题目让我们所求的是最坏的情况,我们可以用SPFA跑一边最短路,然后记录这个最短路所经过的路径然后一一枚举边,将那条边标记为堵车,再求一边最短路路径,,我们可以得到每一组的由n到1城市的最短耗费时间是多少,在与ans比较取最大值,当原先的最短路径上锁经过的边枚举完以后,我们就可以得到最坏的情况所耗费的时间。(样例中,我们可以由5走到2 耗费1的时间,然后再由2走到1,耗费8的时间,在不堵车的情况下9就是最短花费时间,在这时我们将ans更新为9。然后将最优解的第一条边设置为堵车,我们就得先从5走到3,耗费10,再从3走到2耗费9,再从2走到1耗费8,总耗费是27,大于9,所以ans更新为27。在处理最优解得的第二条边,首先从5走到2耗费1,再从2走到4耗费为10,再从4走到1耗费为10,总耗费为21,但没大于ans的值,所以不是最坏的情况,所以output27
   因为时间限制为2s,最开始觉得记录最优解的边太麻烦了,于是就打算每条边都设置为堵车一次,暴力下来这道题,但是题目中的边数根据公式推出来大约是1e7左右,如果这样算的话,2s是不够的,所以必须记录最优解所经过的边,记录边是ac这道题的重点。
    对于这一点我们可以开一个f数组,因为用的SPFA,所以f[i]表示的是在目前情况下,到达i的最优解的上一条路的起点是f[i]。我们可以if(d[queue[Head]]+e[i].aim<d[e[i].lon])这条语句成立以后,找到新的最短路,我们可以将f[i]更新为queue[head]。

 比如在这个城市当中,我们从一号城市开始找,一号城市找完以后f[2]=1,f[4]=1,f[3]=1。然后根距入队顺序找下一条边(这里假定入队为2,4,3)。然后开始从二号城市开始找,搜索到了3和5,f[5]=2,因为2+4>2不是1号城市到3号城市的最优解,所以f[3]的值不更新,走到四号城市,搜索到了1,4,6同理f[3]=1,f[5]=2,f[6]=4。接下来队里的是三号城市,会发现2+5<11,说明从1号城市到3号再到4号城市为1到4的最优解,所以将f[4]更新为3,剩下推到过程省略。。
所以当SPFA结束后用for(i=n;i!=0;i=f[i])就可以搜索出来最优解经过的所以路径。
    重点讲完了,下面开始粘代码。

注意数组一定要开够,codevs上数组没有开够不会显示re,会显示tle。

 #include<cstdio>
 #include<algorithm>
 using namespace std;
 #define  maxn 2147483647
 int point;
 struct node{
  int aim,lon,next,ex;
 };
 node e[];
 ],Head,tail,f[],queue[],d[],m,n;
 ],flag[];
 void add(int x,int y,int z,int t)
 {
  point ++;
  e[point].next=head[x];
  head[x]=point;
  e[point].lon=y;
  e[point].aim=z;
  e[point].ex=t;
 }

 void spfa(int a)
 {
  while(Head<tail)
  {
   ;i=e[i].next)
   {
     if(flag[e[i].ex]==true)continue;
    if(d[queue[Head]]+e[i].aim<d[e[i].lon])
    {
        )f[e[i].lon]=queue[Head];
     d[e[i].lon]=d[queue[Head]]+e[i].aim;
     if(!dui[e[i].lon]){queue[tail++]=e[i].lon;dui[e[i].lon]=true;}
    }
   }
   dui[queue[Head]]=false;
   Head++;
  }
 }

 void prepare()
 {
  ;i<=n;i++)
  d[i]=maxn;
   Head=;
   tail=;
   dui[]=true;
   queue[]=;
   d[]=;
 }
 int main()
 {
  scanf("%d%d",&n,&m);
  ;i<=m;i++)
   {
   int x,y,z;
   scanf("%d%d%d",&x,&y,&z);
     add(x,y,z,point+);
     add(y,x,z,point);
    }
    prepare();
   spfa();
   int ans=d[n];
   prepare();
   int t=n;
   ;i=f[i])
   {
     int q,p;
   ;j=e[j].next)
   if(e[j].lon==t){
     q=j;
     flag[e[j].ex]=true;
     ){flag[e[j+].ex]=;}
     ].ex]=true;
     p=j-;}
     break;
   }
   spfa();
   if(d[n]>ans)ans=d[n];
     flag[e[p].ex]=flag[e[q].ex]=false;
   prepare();
   t=i;
  }
  printf("%d ",ans);
  ;
 }

Codevs 1021 (玛丽卡)的更多相关文章

  1. Codevs 1021 玛丽卡

    Codevs 1021 玛丽卡 题目地址:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他 ...

  2. codevs 1021 玛丽卡(spfa)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  3. Codevs 1021 玛丽卡==洛谷 P1186

    时间限制: 2 s 空间限制: 128000 KB  题目等级 : 大师 Master  题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个 ...

  4. Code[VS]1021 玛丽卡题解

    Code[VS]1021 玛丽卡题解 SPFA Algorithm 题目传送门:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽 ...

  5. 1021 玛丽卡 - Wikioi

    题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知 ...

  6. wikioi 1021 玛丽卡

    链接:http://wikioi.com/problem/1021/ 这题挺有意思的,虽然比较水,但是让我想起来那次百度or腾讯的一道最大流的题目,很给力,也是对最后找边进行优化,不过这题比那题简单多 ...

  7. 玛丽卡(codevs 1021)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  8. codevs1021 玛丽卡

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  9. #图# #SPFA# ----- codevs1021 玛丽卡

    codevs1021 玛丽卡 题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复.因为她和他们不住在同一个城市,因此她开始准备她的长途旅行.在这个国家中每两个城市之间最多 ...

随机推荐

  1. ng-style 的坑 - 对性能的影响

    本文地址:http://www.cnblogs.com/jying/p/5633203.html 熟悉 angular 的前端对ng-style 一定不陌生,这个家伙可以绑定一个函数,使得我们可以在函 ...

  2. 如何在EF CodeFirst中使用唯一约束(Unique)

    一直用EF Fluent Api 做MapConfiguration 所以遇到了唯一约束这个瓶颈 使用唯一约束的两种方式: 方式1 自定义唯一约束 [AttributeUsage(AttributeT ...

  3. excel 导入 sqlserver 字符串被截取为255长度解决方案

    excel表格导入sqlserver数据表中 内容被截取为255长度的字符串. 注意:excel是通过前8行(表头的首行除外)的数据类型来判断导入数据的数据格式的,例如前8行出现整数型,那么默认就用整 ...

  4. Java 零基础之作业小练习

    [练习1] 需求:输入学员的名称及总科目数并显示每项科目成绩的分数,算出总成绩. package demo2; import java.util.Scanner; //先import Scanner语 ...

  5. Java基础之OOP

    1. 类(类型)于对象 (1)面向过程的开发于面向对象开发的区别: 面向过程更重视流程化以及功能的开发,简单点来讲,就是按照固定的模式一步步按部就班的进行,最终达成一个功能的实现.这种模式叫做面向过程 ...

  6. jquery blockui 遮罩

    参考 : http://bookshadow.com/weblog/2014/09/26/jquery-blockui-js-introduction/ blockUI.html blockUI.ht ...

  7. python第十七天-----Django初体验

    Django是一个MTV框架 M:models(数据库) T:templates(放置html模版) V:views(处理用户请求) 那么传说中的MVC框架又是什么呢? M:models(数据库) V ...

  8. java 缓冲

    缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式: 二.内存缓存,也就是实现一个类中静态Map,对这个Map ...

  9. DOCTYPE的重要性

    <!DOCTYPE>是文档类型声明: 声明必须是 HTML 文档的第一行,位于 <html> 标签之前.明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTM ...

  10. aspx页面,中文乱码解决方案

    由于文件编码方式编码方式不统一出现样式中文乱码解决方案: 今天碰到的问题:页面字体样式设置的'微软雅黑',可页面没引用.我调试看到样式出现中文乱码了 这种问题,就需要转换文件的编码方式,如下两步即可解 ...