Codevs 1021 玛丽卡==洛谷 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分钟内是就能通过。
输出文件的第一行中写出用分钟表示的最长时间,在这段时间中,无论哪条路在堵车,玛丽卡应该能够到达麦克处,如果少于这个时间的话,则必定存在一条路,该条路一旦堵车,玛丽卡就不能够赶到麦克处。
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
27
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int map[][],pre[],dis[],lu[];
int n,m,tot,ans=;
bool exist[];
void SPFA(int s)
{
queue<int> q;
memset(dis,0x3f,sizeof(dis));
memset(exist,false,sizeof(exist));
dis[]=;exist[s]=true;q.push(s);
while(!q.empty()){
int x=q.front();q.pop();
exist[x]=false;
for(int i=;i<=n;i++)
{
if(dis[i]>dis[x]+map[x][i]){
dis[i]=dis[x]+map[x][i];pre[i]=x;
if(exist[i]==false){
q.push(i);exist[i]=true;
}
}
}
}
}
void dij()
{
int minl,k;
memset(dis,0x3f,sizeof(dis));
memset(exist,false,sizeof(exist));
dis[]=;
for(int i=;i<=n;i++)
{
minl=0x5f;
for(int j=;j<=n;j++)
if(exist[j]==false&&dis[j]<minl)
k=j,minl=dis[j];
exist[k]=true;
for(int j=;j<=n;j++)
if(map[k][j]!=&&dis[j]>dis[k]+map[k][j])
dis[j]=dis[k]+map[k][j];
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x,y,z;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
map[x][y]=map[y][x]=z;
}
pre[]=;
SPFA();
ans=max(ans,dis[n]);
++tot;lu[tot]=n;
int p=n;
while(pre[p]!=){
++tot;
lu[tot]=pre[p];
p=pre[p];
}
for(int i=;i<=tot-;i++){
int k=map[lu[i]][lu[i+]];
map[lu[i]][lu[i+]]=;
map[lu[i+]][lu[i]]=;
dij();
ans=max(ans,dis[n]);
map[lu[i]][lu[i+]]=k;
map[lu[i+]][lu[i]]=k;
}
printf("%d",ans);
return ;
}
以上是我的代码 本人认为没毛病,求大神解救~~
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = ;
const int maxm = maxn*(maxn - )/;
struct Edge
{
int u,v,w,next;
} edge[maxm];
int head[maxm],vis[maxn],dis[maxn],prev[maxn];
int N,M,tot = ,res; void addedge(int u,int v,int w)
{
edge[tot] = (Edge)
{
u,v,w,head[u]
};
head[u] = tot++;
} int spfa(int x,int y) //虽然玛丽卡在第N个城市,但是1-N的最短距离固定,
{ // 所以我们可以从第1个城市出发,求出1-N的最短路
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
queue<int>que;
dis[] = ;
que.push();
vis[] = ;
while (!que.empty())
{
int u = que.front();
que.pop();
vis[u] = ;
for (int i = head[u]; i != -; i = edge[i].next)
{
int v = edge[i].v;
if ((u == x && v == y) || (u == y && v == x)) continue;
if (dis[u] + edge[i].w < dis[v])
{
dis[v] = dis[u] + edge[i].w;
prev[v] = u; //记录前驱(路径)
if (!vis[v])
{
que.push(v);
vis[v] = ;
}
}
}
}
return dis[N];
} int main()
{ int u,v,w;
memset(head,-,sizeof(head));
memset(prev,,sizeof(prev));
scanf("%d%d",&N,&M);
for (int i = ; i < M; i++)
{
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
res = spfa(,);
int tmp = N;
queue<int>q;
while (tmp)
{
q.push(tmp);
tmp = prev[tmp];
}
while (q.size() > )
{
tmp = q.front();
q.pop();
res = max(res,spfa(tmp,q.front()));
}
printf("%d\n",res);
return ;
}
我们可以用一遍SPFA,求出最短路,然后不难发现,炸最短路上的边可以是答案变得更大,而炸掉非最短路上的边对答案没任何影响
Codevs 1021 玛丽卡==洛谷 P1186的更多相关文章
- Codevs 1021 玛丽卡
Codevs 1021 玛丽卡 题目地址:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他 ...
- codevs 1021 玛丽卡(spfa)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- Code[VS]1021 玛丽卡题解
Code[VS]1021 玛丽卡题解 SPFA Algorithm 题目传送门:http://codevs.cn/problem/1021/ 题目描述 Description 麦克找了个新女朋友,玛丽 ...
- 1021 玛丽卡 - Wikioi
题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知 ...
- wikioi 1021 玛丽卡
链接:http://wikioi.com/problem/1021/ 这题挺有意思的,虽然比较水,但是让我想起来那次百度or腾讯的一道最大流的题目,很给力,也是对最后找边进行优化,不过这题比那题简单多 ...
- 洛谷P1186 玛丽卡 spfa+删边
洛谷P1186 玛丽卡http://blog.csdn.net/huihao123456/article/details/73414139题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. ...
- 洛谷——P1186 玛丽卡
P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...
- 洛谷 P1186 玛丽卡
P1186 玛丽卡 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知道 ...
- 洛谷—— P1186 玛丽卡
https://www.luogu.org/problem/show?pid=1186 题目描述 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长 ...
随机推荐
- Assertion failure layoutSublayersOfLayer:], /SourceCache
现象:代码在simulator上能够正常运行但是在真机上出现 Assertion failure in -[UIView layoutSublayersOfLayer:], /SourceCache/ ...
- UIWebView与JavaScript相互调用
UIWebView与JavaScript的那些事儿 UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候,我们可以hack网页然后显示想显示的内容.其中就要用到javascript的知 ...
- 开源项目: circular-progress-button
带进度条显示的按钮, 其效果如下所示: 其由三部分动画组成: 初始状态->圆环状态->完成状态. 0. 实现从初始到圆环的简单实现: 继承自button 类, 设置其背景 public c ...
- 测试类执行报错:AttributeError: 'Testlei' object has no attribute 'test_cases' 和data,unpack用法解析
a=[{"}] import unittest from ddt import ddt,data,unpack @ddt class Testlei(unittest.TestCase): ...
- OpenCV2:第十一章 图像转换
一.简介 二.例子 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #inclu ...
- NULL Pointer Dereference(转)
0x00 漏洞代码 null_dereference.c: #include <linux/init.h> #include <linux/module.h> #include ...
- 线程调度的问题:Lock Convoy(锁封护)与Priority Inversion(优先级反转)
Lock Convoy(锁封护) [1]Lock Convoy是在多线程并发环境下由于锁的使用而引起的性能退化问题.当多个相同优先级的线程频繁地争抢同一个锁时可能会引起lock convoy问题,一般 ...
- P2261 bzoj1257 [CQOI2007]余数求和
一道数论分块首先这类的求和写一下公式∑n%i=∑n-i*(n/i)= ∑n-∑i*(n/i) 前面的好求所以 ans=nk+∑k*(k/i);于是进行分块这里总结一下只要出现除法∑就进行分块由阿尔贝和 ...
- 数据结构( Pyhon 语言描述 ) — —第11章:集和字典
使用集 集是没有特定顺序的项的一个集合,集中的项中唯一的 集上可以执行的操作 返回集中项的数目 测试集是否为空 向集中添加一项 从集中删除一项 测试给定的项是否在集中 获取两个集的并集 获取两个集的交 ...
- Lex与Yacc学习(二)之第一个Lex程序
用lex识别单词 构建一个识别不同类型英语单词的简单程序.先识别词性(名词,动词等),然后再扩展到处理符合简单英语语法的多个单词的句子. 先列出要识别的一组动词: is am are w ...