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. 压测:mysqlslap

    MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来执行测试,使用起来非常简单,通过mysqlslap –help可以获得可用的选项.这里列一些主 ...

  2. wdatapicker 时间选择器——例

    效果: html: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  3. 用hexo在本地搭建自己的博客

    参考路径:https://blog.csdn.net/Hoshea_chx/article/details/78826689

  4. redis笔记_源码_内存分配

    文件:zmoalloc.h zmoalloc.c 1.求两个整数的余数 eg: 求_n对sizeof(long)的余数(_n&(sizeof(long)-1)), 性能提升为50%-100% ...

  5. postgresql计算2个日期之间工作日天数的方法

    select date_part( 'day', minus_weekend(begin_date,end_date)) from table1 where name in ('a', 'b', 'c ...

  6. ThinkPHP 删除数据

    ThinkPHP删除数据使用delete方法,例如: 直线电机价格 $Form = M('Form'); $Form->delete(5); 表示删除主键为5的数据,delete方法可以删除单个 ...

  7. 使用pageHelper分页查询,报sql语句错误

    1.异常详情:  2.异常分析: (1)pageHelper分页大致流程: 配置默认的拦截器:pagehelper.PageInterceptor,对发送的查询语句进行拦截,拦截之后对原有的查询语句进 ...

  8. 洛谷P3376【模板】网络最大流  Dinic模板

    之前的Dinic模板照着刘汝佳写的vector然后十分鬼畜跑得奇慢无比,虽然别人这样写也没慢多少但是自己的就是令人捉急. 改成邻接表之后快了三倍,虽然还是比较慢但是自己比较满意了.虽然一开始ecnt从 ...

  9. Android基础控件ListView基础操作

    1.简介 基于Android基础控件ListView和自定义BaseAdapter适配器情况下,对ListView的数据删除和添加操作: public boolean add(E e) {//添加数据 ...

  10. Cooki and Session

    目录 Cookie Cookie的由来 什么是Cookie Cookie的原理 查看Cookie Django中操作Cookie 获取Cookie 设置Cookie 删除Cookie Session ...