P1186 玛丽卡

题目描述

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

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

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

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

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

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

输入输出格式

输入格式:

第一行有两个用空格隔开的数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分钟内是就能通过。

输出格式:

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

输入输出样例

输入样例#1:

5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
输出样例#1:

27

初读题目,告诉我们,女朋友有风险,耍朋友须谨慎。

如果你还是没有思路,或者是迷迷糊糊。

应该!多读几遍题。

这道题说的是:最短路线里面的最长时间。就是删除一条边,之后找最短路径。

所有找到每一条最短路径里的时间最长的。

每删一条边,都要spfa一边找到最短的路径,之后比较。

算一道很裸的题?不过。这里的难点在语文。要理解!!

帮助麦克找出玛丽卡按->最短路线->通过不堵车道路->到达他所在城市所需的->最长时间

而代码实现,其实就是最开始一遍spfa。用h数组来记录,当前的点在松弛时,最优的那条边。记录边!!!

之后从终点开始,往回找。由于h里有当前节点前面的边。所以可以找到这个图的最短路径。之后呢,删最短路径就是保证最短路的整体还是有就是堵车的时候不能走最短路,最后也要步走这条边也要找到最短路。而且找的时候专除小的边。

1)会T一个点

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
int next,v,t,val;
} edge[];
int heads[],d[],cnt,head,last,visit[],h[];
int q[];//手写队列
int n,m;
int add(int x,int y,int z) //领接表,里面有起点!这个重要。
{
edge[++cnt].next=heads[x];
edge[cnt].v=y;
edge[cnt].t=x;
edge[cnt].val=z;
heads[x]=cnt;
}
int spfa(int x)
{
memset(d,0x7f,sizeof(d));
d[]=;
int t=edge[x].val;
edge[x].val=0xffff;//删边
head=;
last=;
q[last]=;
visit[]=;
while(head<=last)
{
int a=q[head];
for(int i=heads[a]; i!=-; i=edge[i].next)
{
if(d[edge[i].v]>d[a]+edge[i].val)
{
if(!visit[edge[i].v])
{
q[++last]=edge[i].v;
visit[edge[i].v]=;
d[edge[i].v]=d[a]+edge[i].val;
}
else
{
d[edge[i].v]=d[a]+edge[i].val;
}
}
}
head++;
visit[a]=;
}
edge[x].val=t;
}
int main()
{
memset(d,,sizeof(d));
memset(heads,-,sizeof(heads));
int x,y,z;
scanf("%d%d",&n,&m);
for(int i=; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
head=;
last=;
q[last]=;
visit[]=;
d[]=;
while(head<=last)
{
int a=q[head];
for(int i=heads[a]; i!=-; i=edge[i].next)
{
if(d[edge[i].v]>d[a]+edge[i].val)
{
if(!visit[edge[i].v])
{
q[++last]=edge[i].v;
visit[edge[i].v]=;
d[edge[i].v]=d[a]+edge[i].val;
h[edge[i].v]=i; //记录每个点最短路松弛时的边
}
else
{
d[edge[i].v]=d[a]+edge[i].val;
h[edge[i].v]=i;//同上
}
}
}
head++;
visit[a]=;
}
int b=d[n];
for(int i=n; i!=; i=edge[h[i]].t) //枚举从终点一直到起点,删最短路的一条边。
{
spfa(h[i]);
b=max(b,d[n]);
}
printf("%d",b);
return ;
}

2)AC

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue> using namespace std;
const int D = ;
const int S = 1e6 + ;
const int M = 2e6; struct orz
{
int next,v,t,val;
} edge[S]; int heads[S],d[D],cnt;
int v[D],h[D];
int n,m;
bool cannot[M]; inline long long read()
{
int x=,f=;
char ch=getchar();
while(ch<'' || ch>''){ if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<=''){ x=x*+ch-''; ch=getchar();}
return x*f;
} int add(int x,int y,int z) ///邻接表,里面有起点!这个重要.
{
edge[++cnt].next=heads[x];
edge[cnt].t=x;
edge[cnt].v=y;
edge[cnt].val=z;
heads[x]=cnt;
} int spfa(bool flag)
{
memset(d,0x7f7f7f,sizeof(d));
memset(v,,sizeof(v));
queue<int>q;
q.push();
v[]=;
d[]=;///麦克起点为1
while(!q.empty())
{
int a=q.front();
q.pop();
v[a]=;
for(int i=heads[a]; i!=-; i=edge[i].next)
{
int vv=edge[i].v,val=edge[i].val;
if(cannot[a*+vv]) continue;
if(d[vv]>d[a]+val)
{
d[vv]=d[a]+val;
if(flag) h[vv]=a;
if(!v[vv])
{
q.push(vv);
v[vv]=;
}
}
}
}
} int main()
{
memset(heads,-,sizeof(heads));
int a,b,c;
n=read();m=read();
for(int i=;i<=m;i++)
{
a=read(),b=read(),c=read();
add(a,b,c),add(b,a,c);
}
spfa();
int ans=d[n];
int y=n;
while(y)
{
cannot[y*+h[y]]=;
cannot[h[y]*+y]=;
spfa();
if(d[n]>ans) ans=d[n];
cannot[y*+h[y]]=;
cannot[h[y]*+y]=;
y=h[y];
}
printf("%d\n",ans);
return ;
}

luoguP1186 玛丽卡 x的更多相关文章

  1. [luoguP1186] 玛丽卡(spfa)

    传送门 因为要随机删除一条边,而枚举所有边肯定会超时,经过发现,先求出一遍最短路,而要删除的边肯定在最短路径上,删除其他的边对最短路没有影响. 所以可以先求出最短路,再枚举删除最短路上的每一条边再求最 ...

  2. codevs 1021 玛丽卡(spfa)

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

  3. codevs1021 玛丽卡

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

  4. Codevs 1021 (玛丽卡)

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

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

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

  6. Codevs 1021 玛丽卡

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

  7. 1021 玛丽卡 - Wikioi

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

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

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

  9. P1186 玛丽卡

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

随机推荐

  1. 应用安全 - 工具 | 平台 - Weblogic - 漏洞 - 汇总

    控制台路径 | 弱口令  前置条件 /console CVE-2016-0638  Date 类型远程代码执行 影响范围10.3.6, 12.1.2, 12.1.3, 12.2.1  CVE-2016 ...

  2. vue点击除了某组件本身的其它地方, 隐藏该组件的方法

    点击emoji表情标签, 出现标签组件,点击其它地方, 改组件消失的效果; <template> <div class="writeZoon"> <d ...

  3. JS观察者设计模式:实现iframe之间快捷通信

    观察者设计模式又称订阅发布模式,在JS中我们习惯叫做广播模式,当多个对象监听一个通道时,只要发布者向该通道发布命令,订阅者都可以收到该命令,然后执行响应的逻辑.今天我们要实现的就是通过观察者设计模式, ...

  4. 数塔 Easy

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?  已经告诉你了,这是个DP的题 ...

  5. Python 里面如何生成随机数?

    在 Python 中用于生成随机数的模块是 random,在使用前需要 import. 如下例子可以酌情列举: random.random():生成一个 0-1 之间的随机浮点数: random.un ...

  6. PHP批量导入excell表格到mysql数据库

    PHP批量导入excell表格到mysql数据库,本人通过亲自测试,在这里分享给大家 1,下载 php  excell类库 网上搜索可以下载,这里不写地址 2,建html文件 <form met ...

  7. chromium for android GPU进程结构分析

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jaylinzhou/article/details/27517471 GPU进程的client(Br ...

  8. ubuntu install xsltproc docbook-xsl docbook-xml

    问题一: $ makexsltproc --output phtml/ param.xsl ./pxml/mainbook.xmlmake: xsltproc: Command not foundma ...

  9. vue项目1-pizza点餐系统8-登陆和注册结构

    <template> <!-- 设置行 --> <div class="row mt-3"> <!-- 设置列 --> <di ...

  10. Hive内部表,外部表和分区表

    外部表和内部表的区别 内部表也称之为managed_table: 默认存储在/user/hive/warehouse下,也可以通过location指定: 删除表事,会删除表数据以及元数据: 外部表称之 ...