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. spring mvc文件上传报错:Expected MultipartHttpServletRequest: is a MultipartResolver configured?

    报错原因:spring-mvc.xml 的配置文件中,配置文件上传id不为 “multipartResolver” 解决:id 改为 “multipartResolver”

  2. 第三周课堂笔记1thand2thand3th

    元组   元组是以逗号隔开的 元组有索引有切片,元组是小括号和中括号的集合, 元组中的东西不可修改(小括号内的东西不可被修改,但是小括号里的列表和字典可以被修改)   2. 由内存地址来分 可变数据类 ...

  3. python pywin32学习笔记

    参考博客链接 https://blog.csdn.net/polyhedronx/article/details/81988948 参考博客链接 https://www.cnblogs.com/zha ...

  4. selenium基础(鼠标和键盘事件)

    selenium鼠标和键盘的操作事件 webdriver常见的几种操作方法 clear():清楚文本文字 send_keys(values):模拟按键输入,values是输入的内容 click():单 ...

  5. CSS清除默认边距

    body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquo ...

  6. java_序列化

    import java.io.*; class People implements Serializable { /* * 序列化和反序列化的时候,会抛出就NotSerializableExcepti ...

  7. Oracle批量更改用户下表空间

    --查询某个用户下的表,并生成一个修改其命名空间的批处理语句 select 'alter table '|| table_name ||' move tablespace 要迁入的表空间;' from ...

  8. nginx i.com.conf

    server { listen 9090; server_name i.com; root /Users/chong/Documents/www; # Load configuration files ...

  9. P3480 [POI2009]KAM-Pebbles

    P3480 [POI2009]KAM-Pebbles比如第一个样例 原:0 2 2差: 2 0 0如果把中间的2拿掉一个,就会变成原:0 1 2差: 1 1 0就可以把差看成阶梯nim细节:最终要移到 ...

  10. 廖雪峰Java11多线程编程-3高级concurrent包-2ReadWriteLock

    ReentrantLock保证单一线程执行 ReentrantLock保证了只有一个线程可以执行临界区代码: 临界区代码:任何时候只有1个线程可以执行的代码块. 临界区指的是一个访问共用资源(例如:共 ...