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. 使用CEfSharp之旅(3)下载文件 弹出保存框 IDownloadHandler

    原文:使用CEfSharp之旅(3)下载文件 弹出保存框 IDownloadHandler 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群 ...

  2. C++开发系列-C语言的malloc与C++的new分配空间

    概述 在软件开发过程中,常常需要动态地分配和撤销存储空间,例如对动态链表中结点的插入与删除.在C语言中是利用库函数malloc和free来分配和撤销内存空间的.C++提供了较简便而功能较强的运算符ne ...

  3. Idea 2018.2.5创建springboot项目依赖包没有的错误

  4. JavaScript中获取HTML元素的方式

    JavaScript中获取HTML元素的方式 1.使用id方式获取元素,返回一个具体对象   document.getElementById(id名) 2.使用className方式获取元素,返回类数 ...

  5. unordered_map

    #include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...

  6. JedisCluster API 整理

    windows版redis启动服务器命令:redis-server redis.windows.conf 图表来自菜鸟教程: 列表的操作命令 序号 命令及描述 1 BLPOP key1 [key2 ] ...

  7. Composer环境混乱引起--Fatal error: Call to undefined method Fxp

    Fatal error: Call to undefined method Fxp\Composer\AssetPlugin\Package\Version\V ersionParser::parse ...

  8. mysql TO_DAYS()

    mysql TO_DAYS(date) 函数 TO_DAYS(date) 给定一个日期date, 返回一个天数 (从年份0开始的天数 ). mysql> SELECT TO_DAYS(95050 ...

  9. laravel框架中使用QueryList插件采集数据

    laravel框架中使用queryList 采集数据 采集数据对我们来说真家常便饭,那么苦苦的写正则采集那么一点点东西,花费了自己大把的时间和精力而且没有一点技术含量,这个时候就是使用我们的好搭档Qu ...

  10. IDEA如何像Eclipse打开多个项目?

    简述: 不能采用open方式,得采用 import module方式 (多个项目,可以不再同一个根目录下,真正的类似eclipse方式打开多个项目) 具体操作步骤: 1.选择一个maven项目,右键选 ...