题目描述 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. 使用FreePic2Pdf导出书签至Word建立层级目录——快速初始化Word笔记本目录

    使用FreePic2Pdf导出书签至Word建立层级目录 --快速初始化Word笔记本目录 文:安徽师范大学2014级计算机科学与技术 王昊 (Get Contact:441301158@qq.com ...

  2. 2016 China-Final-F题 ——(SA+二分)

    其实是一个很经典的字符串问题,但是我们比赛的时候没出. 先看一下UVA11107这题,题意是,找出最长的一个字符串,在至少一半的字符串中出现过.只要把所有的字符串用不同的分隔符分开,然后SA一下,最后 ...

  3. Jquery / js 判断数据类型方法(限制文本框类型输入)

    当想要判断文本框中的值是否为自己想要的类型时,可以通过一些方法作出判断,这里对于光标离开文本框时判断文本框中输入的是否是数值类型,如果不是,做出提示 $("#WORKYEARS") ...

  4. Types of Learning

    从四个角度大致总结一下不同类型的机器学习问题. 1. 按照输出空间的变化: 分类问题(二分类.多分类).回归问题 2. 按照输出的标记变化: 监督学习 与 非监督学习 与 半监督学习(树的识别) 与 ...

  5. npm install 出现UNABLE_TO_GET_ISSUER_CERT_LOCALLY

    解决方式 As a workaround you can turn ssl checking off in your .npmrc 执行 npm config set strict-ssl false ...

  6. 配置 samba 实现文件共享

    用于实现文件共享 netstat -apn|grep smb 可以按到 smb服务,需要开启139 .445端口号 需要在防火墙添加如下规则vi /etc/sysconfig/iptables -A ...

  7. 【POJ2699】The Maximum Number of Strong Kings(二分,最大流)

    题意: 有n个队伍,两两都有比赛 知道最后每支队伍获胜的场数 求最多有多少队伍,他们战胜了所有获胜场数比自己多的队伍,这些队伍被称为SK N<=50 思路:把每个队伍和它们两两之间的比赛都当做点 ...

  8. java.sql.SQLException: ORA-00911: invalid character 解决方法

    java.sql.SQLException: ORA-00911: invalid character 控制台抛出这个异常:java.sql.SQLException: ORA-00911: inva ...

  9. pip install lxml出错解决

    初学Python各种版本问题,安装pip install lxml各种出错,解决方法:py -2 -m pip install wheel(PY3上我上个帖子已经标了),http://www.lfd. ...

  10. Unity开发心路历程——制作画板

    有人说 编程是份很无聊的工作 因为整个工作时间面对的都是电脑这种机器 因为眼睛盯着的内容都是索然无味的代码 因为总是会有意想不到的bug让你怀疑自己的智商 而我认为 编程是件及其有意思的事情 可观的收 ...