IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 1131 Subway Map (30 分) -> 正文阅读

[数据结构与算法]1131 Subway Map (30 分)

做不出来,一开始打算和Online map一样,用邻接表的dij做,但是发现这个交叉站点不好表示(用了二维数组存但不理想,超时超限)。
没想到10e5竟然能用dfs做。

本题细节:
1.关于两站位于的线,我一开始也是想用二维v[10000],但是不行,会超,用一维代替二维。
2。怎么判断交叉点?当前的航线和preline不同,交叉点++;
3.本题的输出格式也不太简单,我一开始想把头尾+交叉点再放个数组,航线放入set,但是太复杂了。

get:
1.两点之间的路径不仅可以用二维vecto,也可以一维unordered_map存放,比如 map[a*10000+b]=i; 乘10还是10000,只要保证两数隔开就行。
2.10e5数量级的邻接表更好,如果此时再发现dij做完之后,dfs并不简单,则直接dfs算了。(针对PAT);
3.本题输出,ans[i],ans[i-1]此时preline不同,则应先输出preline再修改,且此时的站点是ans[i-1],不是ans[i];

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
vector<int> v[10000];
int ma=999999,minn=999999;
unordered_map<int,int> mm;
vector<int> ans,path;
vector<int> vis(10000);
int get_t(){
	int cnt=0;
	 int preline=mm[path[0]*10000+path[1]];
	for(int i=2;i<path.size();i++){
		if(mm[path[i]*10000+path[i-1]]!=preline){
			cnt++;
			preline=mm[path[i]*10000+path[i-1]];
		}
	}
	return cnt;
}
void dfs(int be,int end,int cnt){
	if(be==end){
		int now=get_t();
		if(cnt<ma){
			ma=cnt;
			ans=path;
			minn=now;
		}
		else if(cnt==ma && now<minn){
			ans=path;
			minn=now;
		}
		return ;
	}
	for(auto i:v[be]){
		if(!vis[i]){
			vis[i]=1;
			path.push_back(i);
			dfs(i,end,cnt+1);
			path.pop_back();
			vis[i]=0;
		}
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		int k,x;
		cin>>k>>x;
		for(int j=0;j<k-1;j++){
			int y;
			cin>>y;
			mm[y*10000+x]=mm[x*10000+y]=i;
			v[x].push_back(y);
			v[y].push_back(x);
			x=y;
		}
	}
	int m;
	cin>>m;
	for(int i=0;i<m;i++){
		int a,b;
		ma=999999;
		minn=999999;
		ans.clear();
		path.clear();
		cin>>a>>b;
		vis[a]=1;
		path.push_back(a);
		dfs(a,b,0);
		vis[a]=0;
		int preline=0,pres=ans[0];
		printf("%d\n",ans.size()-1);
		for(int j=1;j<ans.size();j++){
		if(preline!=mm[ans[j]*10000+ans[j-1]]){
			if(preline!=0)
			printf("Take Line#%d from %04d to %04d.\n",preline,pres,ans[j-1]);
			preline=mm[ans[j]*10000+ans[j-1]];
			pres=ans[j-1];
				
		}
	}
			printf("Take Line#%d from %04d to %04d.\n",preline,pres,ans[ans.size()-1]);
		
			
	}
	return 0;
} 
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 12:00:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:24:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码