题意:有向图有N个点,当电车进入交叉口(某点)时,它只能在开关指向的方向离开。 如果驾驶员想要采取其他方式,他/她必须手动更换开关。当驾驶员从路口A驶向路口B时,他/她尝试选择将他/她不得不手动更换开关的次数最小化的路线。

编写一个程序,该程序将计算从交点A到交点B所需的最小开关更改次数。第i个交点处的开关最初指向列出的第一个交点的方向。

分析:对于某点i,去往其直接可到达的点列表中的第一个点时不需要更换开关,等价于边长为0;而其他的点需要更换开关,等价于边长为1。dijkstra裸题。

#include<cstdio>
#include<map>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 100 + 10;
const int INF = 0x3f3f3f3f;
struct Edge{
int from, to, dist;
Edge(int f, int t, int d):from(f), to(t), dist(d){}
};
struct HeapNode{
int d, u;
HeapNode(int dd, int uu):d(dd), u(uu){}
bool operator < (const HeapNode&rhs)const{
return d > rhs.d;
}
};
struct Dijkstra{
int n, m;
vector<int> G[MAXN];
vector<Edge> edges;
bool done[MAXN];
int d[MAXN];
int p[MAXN];
void init(int n){
this -> n = n;
for(int i = 1; i <= n; ++i) G[i].clear();
edges.clear();
}
void AddEdge(int from, int to, int dist){
edges.push_back(Edge(from, to, dist));
m = edges.size();
G[from].push_back(m - 1);
}
void dijkstra(int s){
priority_queue<HeapNode> q;
for(int i = 1; i <= n; ++i) d[i] = INF;
memset(done, false, sizeof done);
d[s] = 0;
q.push(HeapNode(0, s));
while(!q.empty()){
HeapNode top = q.top();
q.pop();
if(done[top.u]) continue;
done[top.u] = true;
int len = G[top.u].size();
for(int i = 0; i < len; ++i){
Edge e = edges[G[top.u][i]];
if(d[top.u] + e.dist < d[e.to]){
d[e.to] = d[top.u] + e.dist;
p[e.to] = G[top.u][i];
q.push(HeapNode(d[e.to], e.to));
}
}
}
}
}dij;
int main(){
int N, A, B;
scanf("%d%d%d", &N, &A, &B);
dij.init(N);
for(int i = 1; i <= N; ++i){
int k, x;
scanf("%d", &k);
for(int j = 0; j < k; ++j){
scanf("%d", &x);
if(j == 0) dij.AddEdge(i, x, 0);
else dij.AddEdge(i, x, 1);
}
}
dij.dijkstra(A);
if(dij.d[B] == INF) printf("-1\n");
else printf("%d\n", dij.d[B]);
return 0;
}

  

最新文章

  1. POJ1151Atlantis 矩形面积并[线段树 离散化 扫描线]
  2. ElasticSearchwindow下搭建
  3. Java keytool 使用总结
  4. 看了让人笑了很多很多次的NB的痔疮经历
  5. mysq数据库再次理解
  6. LayoutInflater和inflate()方法的用法
  7. POJ 1989
  8. windows下NGINX和PHP配合(FASTCGI)
  9. Selenium 自动化验收测试
  10. 10、end关键字和Fibonacci series: 斐波纳契数列
  11. 关于textarea的应用--onchage,onpropertychange,oninput
  12. linux 下oracle 11g静默安装(完整版)
  13. Node.js的安装以及Node.js的模块管理
  14. [SCOI2009]生日快乐
  15. Luogu P1082 同余方程(NOIP 2012) 题解报告
  16. 【转载】C++ vector的用法
  17. 解读——angeltoken钱包
  18. [Unity]Unity常见API
  19. &lt;文档学习&gt;AirSim/using_car.md Choosing Your Vehicle: Car or Multirotor
  20. 查找-&gt;静态查找表-&gt;次优查找(静态树表)

热门文章

  1. vue+element ui table组件封装,使用render渲染
  2. ElementUI el-message 提示信息的用法
  3. scrapy中使用 IP 代理
  4. SSM日常报错
  5. 关于java程序在运行时出现a java exception has occured时解决方法
  6. redis 高性能的原因
  7. 微信小程序引用外部js,引用外部样式,引用公共页面模板
  8. onContextItemSelected 与 onMenuItemSelected 的那些事
  9. 原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度
  10. 「Luogu P2468 [SDOI2010]粟粟的书架」