codevs 3971 航班
B 国有N 座城市,其中1 号是这座国家的首都。
N 座城市之间有M 趟双向航班。i 号点的转机次数定义为:从1 号点到i ,最少需要转机几 次。如果1 根本无法到达i ,那么i 点的转机次数是无穷大。
由于天气原因,有些航班会被取消。
一趟航班的取消是可容忍的,仅当这趟航班取消之后,2..N 每个点的转机次数不变或者只 增加了1。
现在kAc 想知道,哪些航班的取消是可容忍的?
如果这样的航班不存在,输出一行 “hehe”(不含引号)
第一行两个正整数N, M
接下来M 行每行两个正整数a, b。表示当前这趟航班的两端是a,b 两座城市 ,保证a 不等于b ,且同一对a, b 只会出现一次。
若干整数,从小到大排序,表示所有的可容忍取消的航班序号。
5 6
1 2
1 3
1 4
3 4
2 5
3 5
2
3
4
5
6
如果1、2 两座城市间的航班被取消,2 号城市到首都原本需要0 次转机(有直达飞机) ,现
在需要先到5 ,再到3 ,再到1 ,转机2 次。这是不可忍受的。
对于40% :N, M<=500
对于70% :N<=500 M <= 50000
对于100% :N, M<=200000
保证初始给定图中所有点的转机次数不是无穷大。
这其实应该叫次短路,每次改一个点
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std; #define fr(x, E) for (__typeof(E.begin()) x = E.begin(); x != E.end(); x++)
//first ,second,指的是vector中定义的第几个元素
#define FR first
#define SC second
#define MP make_pair
#define PB push_back
#define PII pair<int, int>
#define LL long long
#define ALL(x) x.begin(), x.end()
#define SZ(x) ((int)(x).size())
const int MAXN = ;
vector<PII> e[MAXN];//存储边,和第航线序号
int n, m;
int from[MAXN], vis[MAXN], dis[MAXN];
bool isok[MAXN];
int main()
{
freopen("flight2.in", "r", stdin); freopen("flight.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = ; i <= m; i++){
int a, b;
scanf("%d%d", &a, &b);
e[a].PB(MP(b, i)); e[b].PB(MP(a, i));
}
static queue<int> Q;//宽搜各个顶点到首都的转机次数。
Q.push(); vis[] = true;//首都1入队列;
while(SZ(Q)){//队列非空
int x = Q.front(); Q.pop();
fr(it, e[x])//和队首顶点关联的每个顶点
if (!vis[it->FR]){//如果没入队列则入队列
vis[it->FR] = true;
dis[it->FR] = dis[x] + ;
from[it->FR] = it->SC;//记录最短路径航线
Q.push(it->FR);
}
}
bool ok = true;
for (int i = ; i <= n; i++){
bool nok = true; //假设对应最短路不可以替换
fr(it, e[i])//遍历顶点i的每个关联顶点 , //如果存在不在最短路径上,而且距离不超过当前距离的代替顶点 ,
if (it->SC != from[i] && dis[it->FR] <= dis[i])
nok = false;//那么,此顶点对应的最短路径这条航线是可以替换的。
isok[from[i]] = nok;
}
bool ex = false;
for (int i = ; i <= m; i++) if (!isok[i]){
printf("%d\n", i); ex = true;
}
if (!ex) puts("hehe");
}
codevs 3971 航班的更多相关文章
- codevs 3289 花匠
题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
- codevs 2830 蓬莱山辉夜
2830 蓬莱山辉夜 http://codevs.cn/problem/2830/ 题目描述 Description 在幻想乡中,蓬莱山辉夜是月球公主,居住在永远亭上,二次设定说她成天宅在家里玩电脑, ...
随机推荐
- 423 Reconstruct Original Digits from English 从英文中重建数字
给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9.按升序输出原始的数字.注意: 输入只包含小写英文字母. 输入保证合法并可以转换为原始的数字,这意味着像 "ab ...
- jQuery委托
$('#container').on('click', '.elementClass', function() { // code }); http://stackoverflow.com/quest ...
- node入门(一)——安装
node可以让我们用js写服务器.此外还可以用来前端自动化开发,它找到特定服务要使用的包,然后下载.安装.管理. 首先安装node,进入官网下载需要的node版本,然后一键式傻瓜安装.(我的环境是wi ...
- colormap画出的图不是彩色问题
针对matlab2017渲染出的彩色图是黑白的问题. t=labels; t(tstSet(:,end-))=Relabels; t=reshape(t,,); t=t'; figure imshow ...
- 21全志r58m平台的framework在使用过程中会莫名的崩溃掉
21全志r58m平台的framework在使用过程中会莫名的崩溃掉 2018/10/25 16:20 版本:V1.0 开发板:SC5806 1.系统编译: rootroot@cm88:/home/ww ...
- MTK处理器手机 解锁Bootloader 教程
目前很多手机都需要解锁Bootloader之后才能进行刷机操作 本篇教程教你如何傻瓜式解锁Bootloader 首先需要在设置-关于手机 找到版本号(个别手机可能是内核版本号,甚至其他) 然后 快 ...
- 如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret。
如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret. 申请流程如下: 步骤1:登陆腾讯开放平台.链接地址: http://open.qq.com/ . 步骤2:填 ...
- Shell书籍推荐
1.鸟哥私房菜 2.<Linux命令行与shell脚本编程大全> 第二本书买了,对于初学者来说一般.
- 循环冗余校验(CRC)算法入门
http://blog.csdn.net/liyuanbhu/article/details/7882789 前言 CRC校验(循环冗余校验)是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...
- JavaSE-13 内部类
学习要点 内部类的定义 内部类的应用 内部类 定义 Java的一个类中包含着另一类. A类和B类是C类的外部类.B类是C类的外部类.A类也称为顶层类. 如何使用内部类 public class MyF ...