题目描述 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. Finish 和 Complete 的区别

    2012年,在伦敦举行的语言大赛中,圭亚那选手Samsunder Balgobin 在回答比赛中最后一道问题   "你如何用一种容易让人理解的方式解释 complete与finished 的区別"时, ...

  2. angularjs(二)模板终常用的指令的使用方法

    通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板 ...

  3. angularjs(一)基础概念

    一.前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,作为一名业界新秀,紧跟时代潮流,学习掌握新知识自然是不敢怠慢.当听到AngularJs这个名字并知道是google在维 ...

  4. 忘记BIOS超级管理员密码,怎么破解?

    [请尊重原创版权,如需引用,请注明来源及地址] 本人就喜欢没事瞎折腾,动动手活动活动筋骨没坏处,前不久非常便宜的弄到一玩具 ThinkPad T400(公司处理品),外观还算不错,除了电源适配器是坏的 ...

  5. task9暂存

    <h6>第一组项目</h6> <div class="wrap"> <div class="title"> &l ...

  6. VScode常用几个前端插件live HTML previewer和debugger for chrome的配置

    之前一直都是用sublime Text和chrome配合来写前端的页面,自从知道了有liveReload这个神奇的插件之后感觉爽翻了啊.好吧跑远了........ 话说最近微软搞了个VScode,听说 ...

  7. greendao对SQLite数据库的增删改查操作

    利用greendao操作数据库时,都是以对象或者对象的list来进行增删改查的操作,操作的结果都是用一个list来接收的!!! 1.增加一条记录 Stu stu01=new Stu();stu01.s ...

  8. 如何用java获得字符串的ASCII值

    使用Integer.valueOf就可以直接将char类型的数据转为十进制数据表现形式. int value=Integer.valueOf('1');//49int value=Integer.va ...

  9. Linux centOS下搭建RTMP服务器的具体步骤

    以下的所需的安装包,可直接在linux系统终端下载,也可从其他地方下载之后拷到对应目录下解压使用,遇到连接不到国外网站时可改变压缩包地址 1.安装依赖包: #yum install glibc.i68 ...

  10. Android程序crash处理

    Android程序crash处理 时间 2014-11-24 13:45:37  CSDN博客 原文  http://blog.csdn.net/allen315410/article/details ...