Code[VS]1021 玛丽卡题解

题目描述 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


分析

本题求解最短路线通过不堵车道路到达他所在城市所需的最长时间,不难想到,堵车的道路一定要在最短路上才有最大值,否则无论道路在哪都不会影响原来的值。

首先进行一遍SPFA,找出原图中的最短路,并记录路径。再枚举路径上的所有点,删去这条边,再SPFA。一遍遍查找,最终找到最大值。

注释&代码

 #include "bits/stdc++.h"

 using namespace std;
const int maxN = ;
const int INF = ;
struct Edge
{
int from , to , next , w ;
}e[ ]; int n,m,cnt,p[ maxN ],Dis[ maxN ];
int In[ maxN ],pre[ maxN ] ;
bool visited[ maxN ]; void Add_edge(const int x,const int y,const int z)
{
e[ ++cnt ].to = y ;
e[ cnt ].next = p [ x ] ;
e[ cnt ].w = z ;
e[ cnt ].from = x ;
p[ x ] = cnt ;
return ;
} void Spfa ( const int S )
{
int i , t , temp ;
queue <int> Q;
memset ( visited , 0 , sizeof ( visited ) ) ;
memset ( Dis , 0x3f , sizeof ( Dis ) ) ;
memset ( In , 0 , sizeof ( In ) ) ; Q.push( S ) ;
visited[ S ] = true;
Dis[ S ] = 0 ; while( !Q.empty ( ) ) //SPFA找最短路
{
t = Q.front( ) ; Q.pop( ) ; visited [ t ] = false ;
for( i = p[ t ] ; i ; i = e[ i ].next )
{
temp = e[ i ].to;
if ( Dis[ temp ] > Dis[ t ] + e[ i ].w )
{
Dis[ temp ] = Dis[ t ] + e[ i ].w ;
pre [ temp ] = i ; //记录路径
if(!visited[temp])
{
Q.push(temp);
visited[temp]=true;
if(++In[temp]>n)return ;
} }
}
}
} void work ( int x )
{
int i,t,temp;
queue<int> Q;
memset(visited,,sizeof(visited));
memset(Dis,0x3f,sizeof(Dis));
memset(In,,sizeof(In));
int S = , haha ; haha = e[ x ].w , e[ x ].w = INF ;//删边
Q.push( S );
visited[ S ] = true;
Dis[ S ] = 0 ; while( !Q.empty ( ) )//SPFA
{
t=Q.front ( ) ;Q.pop ( ) ;visited[ t ] = false ;
for( i=p[t] ; i ; i = e[ i ].next )
{
temp = e[ i ].to;
if(Dis[ temp ] > Dis[ t ] + e[ i ].w )
{
Dis[ temp ] = Dis[ t ]+e[ i ].w ;
if( !visited[ temp ] )
{
Q.push ( temp ) ;
visited[ temp ] = true ;
if( ++In[ temp ] > n )return ;
}
}
}
}
e[ x ].w = haha ;//恢复
} int main()
{
int x , y , _ ; scanf ( "%d%d" , &n , &m ) ;
for(int i= ; i<=m ; ++i )
{
scanf ( "%d%d%d" , &x , &y , &_ ) ;
Add_edge( x , y , _ ) ;
Add_edge( y , x , _ ) ;
} Spfa( ) ;
int ans = Dis [ n ] ; for ( int i=n ; i!= ; i =e[ pre[ i ] ].from ){
work ( pre[ i ] ) ;
ans = max ( ans , Dis[ n ] ) ;//比较最大值
}
printf ( "%d" , ans ) ;
return ;
}

(完)

Code[VS]1021 玛丽卡题解的更多相关文章

  1. Codevs 1021 玛丽卡

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

  2. codevs 1021 玛丽卡(spfa)

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

  3. 1021 玛丽卡 - Wikioi

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

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

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

  5. wikioi 1021 玛丽卡

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

  6. Codevs 1021 (玛丽卡)

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

  7. 玛丽卡(codevs 1021)

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

  8. Luogu P1186 玛丽卡 【最短路】By cellur925

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

  9. P1186 玛丽卡

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

随机推荐

  1. PHP定时器实现每隔几秒运行一次

    php是服务器端脚本了并不像js那样有专业的settimeout函数来定时执行了,但只要浏览器不关闭各阶层是可以做到了,下面一起来看看. 下面写个简单例子来讲解这个方法. <?php ignor ...

  2. 设计模式学习之组合模式(Composite,结构型模式)(10)

    转载地址:http://www.cnblogs.com/zhili/p/CompositePattern.html 一.引言 在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系 ...

  3. 用脚本创建和恢复 DB2数据库

    CREATE DATABASE AUTOMATIC STORAGE YES ON 'C:\' DBPATH ON 'C:\' USING CODESET GBK TERRITORY CN COLLAT ...

  4. windows64系统中mysql64位绿色安装

    将下载压缩包解压到任意目录 配置安装文件: # For advice on how to change settings please see# http://dev.mysql.com/doc/re ...

  5. PAT A 1014. Waiting in Line (30)【队列模拟】

    题目:https://www.patest.cn/contests/pat-a-practise/1014 思路: 直接模拟类的题. 线内的各个窗口各为一个队,线外的为一个,按时间模拟出队.入队. 注 ...

  6. 移动端_line-height问题

    如果把line-height加1px,iPhone文字就会下移,由于我们app的ios用户居多,并且android机型太多,不同机型也会显示不同,所以只能退而求其次了. line-height的兼容问 ...

  7. hash 分区的用途是什么?

    Hash partitioning enables easy partitioning of data that does not lend itself to rangeor list partit ...

  8. Liferay 6.2 改造系列之十四:修改组织的表单内容

    在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sections that will b ...

  9. HTML meta viewport属性说明(mark)

    什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤 到很小的窗口中(这样会破坏没有针对手 ...

  10. torch7安装

    按照官网进行安装即可;(http://torch.ch/docs/getting-started.html#_) # in a terminal, run the commands WITHOUT s ...