https://www.luogu.org/problem/show?pid=T2487

题目背景

小L那没出息的儿子当上了一个公交司机。

题目描述

每个司机都有一个牌子,牌子的正面标出了这个司机所开的线路号。另外一面则随便写了一个号码。但是,当小L的儿子拿到他的牌子时,却发现牌子的两面都不是他开的线路号,所以他决定跟其他人换。(真笨~不会找领导吗?)当然,所有的司机都只有当小L的儿子手里的牌子的某一面上写了自己的线路号时才愿意跟他换,所以,小L想知道自己的儿子至少要换几次牌子才能换到一张写有自己线路号的牌子。小L很急,所以他就拜托你去帮他了。

输入输出格式

输入格式:

第一行包含一个整数K ,表示车的数量。(小L的车除外)这些车的编号依次从1到K。

接下来的K行,每行包括此车对应的线路号和牌子另一面的号码(该号码是一个长整型范围内的数字)。

最后一行是安排小L开的公交车线路号以及给他的牌子上的号码。

输出格式:

输出文件只有1行,是最少交换次数M。

如果没有方案,则输出”IMPOSSIBLE”(引号不要输出)。

输入输出样例

输入样例#1:

4
8 5
5 4
7 4
1 5
4 1 8
输出样例#1:

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的一生)的更多相关文章

  1. 历年NOIP中的搜索题

    什么题目都不会做于是开始做搜索题. 然而我搜索题也不会做了. 铁定没戏的蒟蒻. 1.NOIP2004 虫食算 “对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立.输入数据 ...

  2. 洛谷U4727小L的二叉树[树转序列 LIS]

    题目背景 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣. 所以,小L当时卡在了二叉树. 题目描述 在计算机科学中,二叉树是每个结点最多有两个子结点的 ...

  3. bnuoj 33656 J. C.S.I.: P15(图形搜索题)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=33656 [题解]:暴力搜索题 [code]: #include <iostream> # ...

  4. 【BZOJ4030】[HEOI2015]小L的白日梦

    [BZOJ4030][HEOI2015]小L的白日梦 题面 BZOJ 洛谷 题解 要求的是最小的不开心连续段的期望. 然后发现自己就不会做了. 然后就可以来抄题解啦. 首先来猜性质: 第一个,一定是按 ...

  5. BZOJ 4030: [HEOI2015]小L的白日梦

    4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 172  Solved: 39[Submit][Statu ...

  6. 小L的试卷

    题目描述 小L期末考试结束,高高兴兴放假回家了,可是那么多试卷,老师还要加班批改,有n份试卷由k个老师批改,n份试卷进行了密封编号,由于试卷上的做题情况和书写的规范程序不一样,批改不同的试卷用时也可能 ...

  7. 2018.12.1 万圣节的小L

    我回来啦 试题描述 今天是万圣节,小L同学开始了一年一度的讨要糖果游戏,但是在刚刚过去的比赛中小有成就的他打算给自己增加一点难度:如果没有讨到每一家的糖果就算输. 已知小L共有n(n不大于10000) ...

  8. 快速入门PaddleOCR,并试用其开发一个搜题小工具

    介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. ...

  9. ACM D的小L

    D的小L 时间限制:4000 ms  |  内存限制:65535 KB 难度:2   描述       一天TC的匡匡找ACM的小L玩三国杀,但是这会小L忙着哩,不想和匡匡玩但又怕匡匡生气,这时小L给 ...

随机推荐

  1. 2_2.springboot2.x配置之自动配置原理

    前言 SpringBoot 自动配置原理: 本文主要分为三大部分: SpringBoot 源码常用注解 SpringBoot 启动过程 SpringBoot 自动配置原理 1. SpringBoot ...

  2. 谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用

    /*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,基于并行查询要启动并行进程.分配任务与系统资源.合并结果集,这些都是比较消耗资源,但我们为能够减少执行事务的时间使用paral ...

  3. 常用Linux Tips(不定期更新)

    查看本机所有开放端口 lsof -i -P | grep -i listen 查看一段文本单词出现频率 awk '{b[length($0)]++;total_lines++;for(i=1;i< ...

  4. vue+ivew使用Collapse 折叠面板把全部面板展开

    1.需求: 在使用搜索功能时候,只显示搜索到的panel并且将搜索到的含有该专家的panel展开,如图                1.html,注意黄色部分,作为每个panel的key值,要唯一 ...

  5. field方法属于模型的连贯操作方法之一

    field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询 指定字段 在查询操作中field方法是使用最频繁的. $Model->fie ...

  6. Hystrix容错处理

    如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直接提供者响应或超时.在高负载场景下,如果不做任何处理,此类问题可能会导致服务消费者的资源耗竭甚至整个系统的崩溃.这时,就需要进行容 ...

  7. centos 6.5 yum安装rabbitMQ

    1.查看系统版本, 升级系统基本lib库 [root@test ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@test ~] ...

  8. php日期

    PHP Date() 函数 PHP date() 函数用于格式化时间/日期. 该函数可把时间戳格式化为可读性更好的日期和时间. 时间戳是一个字符序列,表示一定的事件发生的日期/时间. 语法 date( ...

  9. laravel中如何使用Redis(Redis是什么)

    laravel中如何使用Redis(Redis是什么) 一.总结 一句话总结: 基于内存亦可持久化键值数据库 Redis是完全开源免费的,遵守BSD协议,是一个高性能的键值数据库.是当前最热门的的的N ...

  10. CDN与智能DNS原理和应用

    1.cdn概念,DNS概念 CDN:Centent Delivery Network(内容分发网络) 使用户可以就近取得所需内容,提高用户访问网站相应速度 CDN=更智能的镜像+缓存+流量导流: DN ...