【1131】Subway Map (30分)【难题队列】

简介: 【1131】Subway Map (30分)【难题队列】【1131】Subway Map (30分)【难题队列】
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>  
#include<map>
#include<vector>
#include<queue> 
#include<unordered_map>
using namespace std;  
int visit[10000],minCnt,minTransfer;
vector<vector<int>> v(10000);
vector<int> path,tempPath;//路径vector
int start,end1;//起点 终点
unordered_map<int,int> line;
/*unordered_map<int,int>line存储两个结点的边所属的路线
假设边两端为a到b,line的键为a*10000+b,值为这条边所属的路线*/
int transferCnt(vector<int> a){//传入临时路径
  int cnt=-1,preLine=0;
  for(int i=1;i<a.size();i++){
    if(line[a[i-1]*10000+a[i]] != preLine) 
      cnt++;//换乘数cnt+1
    preLine=line[a[i-1]*10000+a[i]];
  }
  return cnt;//输出换乘数
}
void dfs(int node,int cnt){ //cnt为换乘数
  if(node==end1&&(cnt<minCnt||(cnt ==minCnt&&
transferCnt(tempPath) <minTransfer))) {
  minCnt=cnt;//更新cnt
  minTransfer=transferCnt(tempPath);//更新最小换乘次数
  path=tempPath;//更新路径vector
  }
  if(node == end1) return;//边界
  for(int i=0;i<v[node].size();i++){
    if(visit[v[node][i]] == 0){
      visit[v[node][i]]=1;//加锁
      tempPath.push_back(v[node][i]);
      dfs( v[node][i] ,cnt+1); //cnt+1,进入下一层dfs
      visit[v[node][i] ]=0;//解锁
      tempPath.pop_back();
    }
  }
}
int main(){   
  int n,m,k,pre,temp;
  scanf("%d",&n);//地铁路线数
  for(int i=0;i<n;i++){
    scanf("%d%d",&m,&pre);//pre为m线路的首站
    for(int j=1;j<m;j++){//for循环剩下的m-1个站
      scanf("%d",&temp);
      v[pre].push_back(temp);
      //首站为pre的线路(vector里)加上temp站
      v[temp].push_back(pre);
      //temp站的vector里加入首站(pre)
      line[pre*10000+temp]=line[temp*10000+pre]=i+1;
      //pre到temp的线路=temp到pre的线路+1
      pre=temp;//首站为temp
    }
  }
  scanf("%d",&k);//k次查询
  for(int i=0;i<k;i++){
    scanf("%d%d",&start,&end1);
    //查询start站到end1站
    //minCnt为最小换乘数,minTransfer为换乘站
    minCnt=99999,minTransfer=99999;//初始化
    tempPath.clear();
    tempPath.push_back(start);//把start压入临时路径vector
    visit[start]=1; //加锁
    dfs(start,0); //递归DFS!!!!!!!!!
    visit[start]=0; //解锁
    //以下为output
    printf("%d\n",minCnt);//起点&终点之间的min站数
    int preLine=0,preTransfer=start;
    for(int j=1;j<path.size() ; j++){
      if(line[path[j-1]*10000+path[j]] != preLine){
        if(preLine != 0) //每当line和preline不等则输出这句话
          printf("Take Line#%d from %04d to %04d.\n",
          preLine,preTransfer,path[j-1] );
        preLine=line[path[j-1]*10000+path[j]];//更新上一条线路号
        preTransfer = path[j-1];//更新上一个换乘站
      }
    }   
    printf("Take Line#%d from %04d to %04d.\n", 
        preLine,preTransfer,end1);//输出最后一小截线路
        //preLine路线 从preTransfer站到end1站
  }
  system("pause");
  return 0;
}
相关文章
|
分布式计算 Scala Spark
Scala入门到精通——第四节 Set、Map、Tuple、队列操作实战
本节主要内容 mutable、immutable集合 Set操作实战 Map操作实战 Tuple操作实战 队列操作实战 栈操作实战 mutable、immutable集合 以下内容来源于scala官方文档: http://www.scala-lang.org/docu/files/collections-api/collections.html Scala co
5320 0
|
3月前
|
Dart
Dart之集合详解(List、Set、Map)
Dart之集合详解(List、Set、Map)
|
3月前
|
存储 JavaScript 前端开发
JavaScript进阶-Map与Set集合
【6月更文挑战第20天】JavaScript的ES6引入了`Map`和`Set`,它们是高效处理集合数据的工具。`Map`允许任何类型的键,提供唯一键值对;`Set`存储唯一值。使用`Map`时,注意键可以非字符串,用`has`检查键存在。`Set`常用于数组去重,如`[...new Set(array)]`。了解它们的高级应用,如结构转换和高效查询,能提升代码质量。别忘了`WeakMap`用于弱引用键,防止内存泄漏。实践使用以加深理解。
58 3
|
29天前
|
存储 安全 Java
java集合框架复习----(4)Map、List、set
这篇文章是Java集合框架的复习总结,重点介绍了Map集合的特点和HashMap的使用,以及Collections工具类的使用示例,同时回顾了List、Set和Map集合的概念和特点,以及Collection工具类的作用。
java集合框架复习----(4)Map、List、set
|
22天前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
22天前
|
算法 Java 索引
【Java集合类面试四】、 描述一下Map put的过程
这篇文章详细描述了HashMap中put操作的过程,包括首次扩容、计算索引、插入数据以及链表转红黑树和可能的再次扩容。
【Java集合类面试四】、 描述一下Map put的过程
|
1月前
|
存储
|
22天前
|
安全 Java
【Java集合类面试五】、 如何得到一个线程安全的Map?
如何得到一个线程安全的Map的方法包括:使用Collections工具类将Map包装为线程安全,使用java.util.concurrent包下的ConcurrentHashMap,以及不推荐使用性能较差的Hashtable。
|
22天前
|
安全 Java
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。
|
2月前
|
存储 安全 Java
Java基础之集合Map
【7月更文挑战第8天】Java中的Map集合以键值对方式存储数据,如`Map&lt;&quot;name&quot;, &quot;张三&quot;&gt;`。Map接口定义了存取、判断、移除等操作,包括`put`、`get`、`containsKey`等方法。HashMap是最常用的实现,基于哈希表,允许null键值,但不保证顺序。其他实现包括同步的Hashtable、处理属性文件的Properties、保持插入顺序的LinkedHashMap、基于红黑树的TreeMap、弱引用的WeakHashMap、并发安全的ConcurrentHashMap和针对枚举优化的EnumMap。
30 4