Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

路人丁成为了一名新公交车司机,每个司机都有一张牌子,牌子的正面写了拥有这个牌子的司机开的线路号,另外一面随便写了一

个号码。但是路人丁的牌子两面写的都不是自己开的线路号。所以他决定跟其他人换,当然,所有的司机都只有当路人丁手里

的牌子上的某面写了自己的线路号时才愿意跟他换。所以路人丁想知道自己至少要换几次牌子才能换到一张写有自己线路号的

牌子。

【输入格式】

第一行包括一个整数K(K≤1000),表示车的数量(新车除外)。这些车的编号依次从1到K。接下来的K行,每行包括此车对应的线路号和牌子另一面的号码(长整范围的数字)。 最后一行是安排路人丁开的公交车线路号以及给他的牌子上的号码。

【输出格式】

首行是最少交换的次数M,接下来的M行顺序输出要交换牌子的车的编号。如果没有方案,则输出 IMPOSSIBLE。

Sample Input

4

8 5

5 4

7 4

1 5

4 1 8

Sample Output

2

4

2

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t087

【题意】

【题解】



牌子的另外一面对应的交通线;

看看是哪个公交的交通线;

然后用一条边由前者指向后者;

表示可以从前者换到后者;

肯定没有必要连成一个环啦;

想象一下就是一个牌子一直和另外一个牌子换。

跑个最短路写个路径输出就好

(建图的话一定要按照代码的方式建图)

不然方案和答案会不一样。

(可能会不一样)

(算是贪心吧?



【完整代码】

#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x) typedef pair<int, int> pii;
typedef pair<LL, LL> pll; const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1100; int n,a1,a2;
int idx[N],ano[N];
int dis[N],pre[N],dl[N],h,t;
int zh[N];
vector <int> G[N]; void output_ans(int now)
{
if (pre[now] == 0)
return;
output_ans(pre[now]);
printf("%d\n", dl[now]);
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
rei(n);
rep1(i, 1, n)
rei(idx[i]), rei(ano[i]);
rei(idx[n + 1]), rei(a1), rei(a2);
if (a1 == idx[n + 1] || a2 == idx[n + 1])
{
puts("0");
return 0;
}
rep1(i, 1, n)
{
rep1(j, 1, n)
{
if (ano[i] == idx[j])
G[i].push_back(j);
}
if (a1 == idx[i] || a2==idx[i])
G[n + 1].push_back(i);
}
memset(dis, 255, sizeof dis);
dis[n + 1] = 0;
h = 1, t = 1;
dl[1] = n + 1;
while (h <= t)
{
int x = dl[h++];
int len = G[x].size();
rep1(i, 0, len - 1)
{
int y = G[x][i];
if (dis[y] == -1)
{
dis[y] = dis[x] + 1;
dl[++t] = y;
pre[t] = h - 1;
if (ano[y] == idx[n + 1])
{
printf("%d\n", dis[y]);
output_ans(t);
return 0;
}
}
}
}
puts("IMPOSSIBLE");
return 0;
}

最新文章

  1. Non-blocking read on a subprocess.PIPE in python
  2. pointer to function
  3. 重复发起Volley请求不要使用同一对象
  4. CVTE实习面经
  5. Pipe
  6. javascript:void(0)和javascript:;的用法
  7. 分页sql存储过程算法
  8. Lua代码解析-写给C和C++开发人员
  9. VisualSVN Server 从此告别SVN记事本配置
  10. JavaEE Tutorials (22) - 事务
  11. linux perm
  12. 关于用模拟器运行百度地图API无法定位的问题 - 不能用模拟器
  13. LitepalNewDemo【开源数据库ORM框架-LitePal2.0.0版本的使用】
  14. Django学习笔记(二)视图函数
  15. Rectangular Covering [POJ2836] [状压DP]
  16. SQL实现如何计算项目进度总共天数情况、已经施工天数情况、以及施工进度百分比
  17. 逆向知识第一讲,IDA的熟悉使用
  18. 让Elasticsearch集群冷热分离、读写分离【转】
  19. hdoj1905 Pseudoprime numbers (基础数论)
  20. JMeter 生成CSV文件中文变乱码的问题

热门文章

  1. JavaScript 倒计时器,闹钟功能
  2. bootstrap tab页
  3. 【Educational Codeforces Round 33 B】Beautiful Divisors
  4. stm32单片机的封装
  5. python3 turtle 画国际象棋棋盘
  6. vagrant 的安装与使用
  7. flask的使用(一)
  8. POJ 1679 The Unique 次最小生成树 MST
  9. Spring Boot系列二 Spring @Async异步线程池用法总结
  10. C++利用SOAP开发WebService