T2487 公交司机(搜索题)(小L的一生)
https://www.luogu.org/problem/show?pid=T2487
题目背景
小L那没出息的儿子当上了一个公交司机。
题目描述
每个司机都有一个牌子,牌子的正面标出了这个司机所开的线路号。另外一面则随便写了一个号码。但是,当小L的儿子拿到他的牌子时,却发现牌子的两面都不是他开的线路号,所以他决定跟其他人换。(真笨~不会找领导吗?)当然,所有的司机都只有当小L的儿子手里的牌子的某一面上写了自己的线路号时才愿意跟他换,所以,小L想知道自己的儿子至少要换几次牌子才能换到一张写有自己线路号的牌子。小L很急,所以他就拜托你去帮他了。
输入输出格式
输入格式:
第一行包含一个整数K ,表示车的数量。(小L的车除外)这些车的编号依次从1到K。
接下来的K行,每行包括此车对应的线路号和牌子另一面的号码(该号码是一个长整型范围内的数字)。
最后一行是安排小L开的公交车线路号以及给他的牌子上的号码。
输出格式:
输出文件只有1行,是最少交换次数M。
如果没有方案,则输出”IMPOSSIBLE”(引号不要输出)。
输入输出样例
4
8 5
5 4
7 4
1 5
4 1 8
2
说明
K<=1000。
数据保证线路号之间不重复。
升级版
【输出】
首行是最少交换的次数M,接下来的M行顺序输出要交换牌子的车的编号。如果没有方案,则输出IMPOSSIBLE。
题解
我们分别叫正面和背面A和B。两个点有边的条件是,A1=A2且B1=B2 或 A1=B2且B1=A2。
求出以n为源点的最短路,枚举每一个点。因为前面的交换都不需要满足路人丁,最后一次需要满足,所以最后一次要判断一下是否能够满足丁,然后找出最小值输出。
#include <string>
#include <cstring>
#include <cstdio> long dist[];
bool used[];
long a[];
long b[]; struct node
{
long ind;
node* nxt;
}; node* head[];
long g[];
long n;
/*
void output(long l)
{
if (!l)
return;
output(g[l]);
printf("%ld\n",l);
}
*/
void dijkstra()
{
memset(dist,0x7f,sizeof dist);
for (node* vv=head[n];vv;vv=vv->nxt)
dist[vv->ind] = ;
used[n] = true;
for (long l=;l<n;l++)
{
long nearest = 0x7f7f7f7f;
long u = ;
for (long i=;i<n+;i++)
{
if (dist[i]<nearest&&!used[i])
{
nearest = dist[i];
u = i;
}
}
used[u] = true;
for (node* vv=head[u];vv;vv=vv->nxt)
{
long v = vv->ind;
if (!used[v]&&dist[v]>dist[u]+)
{
dist[v] = dist[u]+;
g[v] = u;
}
}
}
} long getint()
{
long rs=;bool sgn=;char tmp;
do tmp = getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){tmp=getchar();sgn=;}
do rs=(rs<<)+(rs<<)+tmp-'';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
} void insert(long a,long b)
{
node* nn = new node;
nn->ind = b;
nn->nxt = head[a];
head[a] = nn;
}
int main()
{
// freopen("bus.in","r",stdin);
// freopen("bus.out","w",stdout);
n = getint();
for (long i=;i<n+;i++)
{
a[i] = getint();
b[i] = getint();
}
long des = getint();
n ++;
a[n] = getint();
b[n] = getint();
for (long i=;i<n+;i++)
{
for (long j=;j<n;j++)
{
if (i == j) continue;
if (a[i]==a[j]||b[i]==a[j])
{
insert(i,j);
}
}
}
dijkstra();
long ans = 0x7f7f7f7f;
long mov = ;
for (long i=;i<n;i++)
if (a[i]==des||b[i]==des)
if (dist[i] < ans)
{
ans = dist[i];
mov = i;
}
if (ans == 0x7f7f7f7f)
printf("IMPOSSIBLE");
else
{
printf("%ld\n",ans);
//output(mov);
}
return ;
}
快十倍的代码:
# include <iostream>
# include <cstdio>
# include <fstream>
using namespace std;
struct node
{
int t,f;
}a[];
int visit[],q[],time1[],c[];
int main()
{
int n,i,t,n1,n2,ff,r,j,f,x,k;
cin>>n;
for (i=;i<=n;i++)
scanf("%d%d",&a[i].t,&a[i].f);
cin>>t>>n1>>n2;
r=;
for (i=;i<=n;i++)
if (a[i].t==n1 || a[i].t==n2)
{
r++;
q[r]=i;
visit[i]=;
time1[i]=;
if (a[i].f==t)
{
cout<<<<endl;
return ;
}
}
f=;
while (f<=r)
{
x=q[f];
for (i=;i<=n;i++)
if (a[i].t==a[x].f && !visit[i])
{
r++;
q[r]=i;
visit[i]=;
time1[i]=time1[x]+;
if (a[i].f==t)
{
printf("%d\n",time1[i]);
return ;
}
}
f++;
}
cout<<"IMPOSSIBLE"<<endl;
return ;
}
T2487 公交司机(搜索题)(小L的一生)的更多相关文章
- 历年NOIP中的搜索题
什么题目都不会做于是开始做搜索题. 然而我搜索题也不会做了. 铁定没戏的蒟蒻. 1.NOIP2004 虫食算 “对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立.输入数据 ...
- 洛谷U4727小L的二叉树[树转序列 LIS]
题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...
- bnuoj 33656 J. C.S.I.: P15(图形搜索题)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=33656 [题解]:暴力搜索题 [code]: #include <iostream> # ...
- 【BZOJ4030】[HEOI2015]小L的白日梦
[BZOJ4030][HEOI2015]小L的白日梦 题面 BZOJ 洛谷 题解 要求的是最小的不开心连续段的期望. 然后发现自己就不会做了. 然后就可以来抄题解啦. 首先来猜性质: 第一个,一定是按 ...
- BZOJ 4030: [HEOI2015]小L的白日梦
4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 172 Solved: 39[Submit][Statu ...
- 小L的试卷
题目描述 小L期末考试结束,高高兴兴放假回家了,可是那么多试卷,老师还要加班批改,有n份试卷由k个老师批改,n份试卷进行了密封编号,由于试卷上的做题情况和书写的规范程序不一样,批改不同的试卷用时也可能 ...
- 2018.12.1 万圣节的小L
我回来啦 试题描述 今天是万圣节,小L同学开始了一年一度的讨要糖果游戏,但是在刚刚过去的比赛中小有成就的他打算给自己增加一点难度:如果没有讨到每一家的糖果就算输. 已知小L共有n(n不大于10000) ...
- 快速入门PaddleOCR,并试用其开发一个搜题小工具
介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...
- ACM D的小L
D的小L 时间限制:4000 ms | 内存限制:65535 KB 难度:2 描述 一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...
随机推荐
- 2019-11-7-C#-dotnet-线程不安全的弱引用缓存
title author date CreateTime categories C# dotnet 线程不安全的弱引用缓存 lindexi 2019-11-7 9:45:5 +0800 2019-11 ...
- unity3d入门 Demo 学习记录
闲来学习一下 unity3d 的Demo,记录如下. 官方 Demo,名字为 Roll-A-Ball,如图 场景比较简单,包含地面.玩家精灵.主摄像机.墙壁.可拾取的方块.分数为示 text.平行光源 ...
- Bootstrap Paginator分页插件(mark)
Bootstrap Paginator分页插件
- 一个简单的SpringBoot入门程序
1. 使用IDEA构建Maven项目 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- about how to determine a prime number
(1) if divided by 2 or 3, then no; (2) we only have to go through prime factors; because a composite ...
- mysql localhost可以连输入本机ip地址连接不了
Mysql 默认是没有开启这个权限的(只允许使用 host:localhost,或者 host:127.0.0.1),如果想用 host:192.168.1.* ,来访问mysql ,需要手动开启这个 ...
- python 版本配置问题
环境变量里有anaconda 但是命令行输入python却并不是anaconda里的python 这个现象的产生是由于anaconda在环境变量里的顺序靠后,python2.7已经在其他环境变量里被找 ...
- php链表笔记:链表的检测
<?php /** * Created by PhpStorm. * User: huizhou * Date: 2018/12/2 * Time: 11:48 */ /** * 链表的检测 * ...
- iOS程序两中启动图方式和一些坑LaunchImage 和 Assets.xcassets(Images.xcassets)
一.通过LaunchScreen.storyboard 作启动图 1>在LaunchScreen.storyboard中拖拽一个imageView放上启动图片 注意:记得勾选右边的 User a ...
- php构造方法(函数)基础
什么是构造函数呢?在回答这个问题之前,我们来看一个需求:我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就指定这个对象的年龄和姓名,该怎 ...