pat天梯赛练习集合 L3-007 天梯地图
加了一些花的最短路,点的个数为500不需要堆优化,改一下dij的判断条件就可以了。
上代码:
- #include <iostream>
- #include <cstring>
- #include <string>
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int maxn=;
- const int inf=0x3f3f3f3f;
- struct node
- {
- int id;
- int cost;
- int time;
- };
- int s,e;
- int n,m;
- vector<int> line0;
- vector<int> line1;
- vector<node> edge[maxn];
- int d0[maxn];
- int d1[maxn];
- void build_map()
- {
- int v1,v2,ow,cost,time;
- scanf("%d %d %d %d %d",&v1,&v2,&ow,&cost,&time);
- node temp;
- temp.cost=cost;
- temp.time=time;
- temp.id=v2;
- edge[v1].push_back(temp);
- if(ow==)
- {
- temp.id=v1;
- edge[v2].push_back(temp);
- }
- }
- void dij0() // deug
- {
- int vis[maxn];
- int pre[maxn];
- int cost[maxn];
- cost[s]=;
- pre[s]=-;
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;i++) d0[i]=inf;
- d0[s]=;
- while()
- {
- int v=-;
- for(int i=;i<=n;i++)
- {
- if(vis[i]== && ( v==- || d0[v] > d0[i])) v=i;
- }
- if(v==-) break;
- vis[v]=;
- int len=edge[v].size();
- for(int i=;i<len;i++)
- {
- node temp=edge[v][i];
- if(vis[temp.id] == )
- {
- if(d0[temp.id] > d0[v]+temp.time )
- {
- d0[temp.id]=d0[v]+temp.time; //
- pre[temp.id]=v;
- cost[temp.id]=cost[v]+temp.cost;
- }
- else if(d0[temp.id] == d0[v]+temp.time)
- {
- if(cost[temp.id] > cost[v]+temp.cost)
- {
- cost[temp.id]=cost[v]+temp.cost;
- pre[temp.id]=v;
- }
- }
- }
- }
- }
- // cout<<"1"<<endl;
- int zz=e;
- line0.push_back(e);
- while(pre[zz]!=-) //
- {
- line0.push_back(pre[zz]);
- zz=pre[zz];
- // cout<<zz<<endl;
- }
- //cout<<"2"<<endl;
- reverse(line0.begin(),line0.end());
- }
- void dij1() // deug
- {
- int vis[maxn];
- int pre[maxn];
- int cost[maxn];
- cost[s]=;
- pre[s]=-;
- memset(vis,,sizeof(vis));
- // vis[s]=1;
- for(int i=;i<=n;i++) d1[i]=inf;
- d1[s]=;
- while()
- {
- int v=-;
- for(int i=;i<=n;i++)
- {
- if(vis[i]== && (v==- || d1[v] > d1[i])) v=i;
- }
- if(v==-) break;
- vis[v]=;
- // line1.push_back(v);
- int len=edge[v].size();
- for(int i=;i<len;i++)
- {
- node temp=edge[v][i];
- if(vis[temp.id]==)
- {
- if(d1[temp.id] > d1[v]+temp.cost)
- {
- d1[temp.id]=d1[v]+temp.cost; //
- pre[temp.id]=v;
- cost[temp.id]=cost[v]+;
- }
- else if(d1[temp.id] == d1[v]+temp.cost)
- {
- if(cost[temp.id] > cost[v]+)
- {
- cost[temp.id]=cost[v]+;
- pre[temp.id]=v;
- }
- }
- }
- }
- }
- int zz=e; // route
- line1.push_back(e);
- while(pre[zz]!=-)
- {
- line1.push_back(pre[zz]);
- zz=pre[zz];
- }
- reverse(line1.begin(),line1.end());
- }
- int check()
- {
- int len1=line1.size();
- int len0=line0.size();
- if(len1 != len0) return ;
- for(int i=;i<len1;i++)
- {
- if(line0[i] != line1[i]) return ;
- }
- return -;
- }
- int main()
- {
- cin>>n>>m;
- while(m--) build_map();
- cin>>s>>e;
- dij0();// 0 refers to the shortest time
- dij1();// 1 refers to the shortset cost
- if(check() == ) // diff
- {
- printf("Time = %d: ",d0[e]);
- cout<<line0[];
- for(int i=;i<line0.size();i++) cout<<" => "<<line0[i];
- cout<<endl;
- printf("Distance = %d: ",d1[e]);
- cout<<line1[];
- for(int i=;i<line1.size();i++) cout<<" => "<<line1[i];
- cout<<endl;
- }
- else
- {
- printf("Time = %d; ",d0[e]);
- printf("Distance = %d: ",d1[e]);
- cout<<line1[];
- for(int i=;i<line1.size();i++) cout<<" => "<<line1[i];
- cout<<endl;
- }
- return ;
- }
pat天梯赛练习集合 L3-007 天梯地图的更多相关文章
- PAT 天梯赛 L2-005 集合相似度
set的应用 题目链接 题解 有点像集合的交并操作,直接利用set进行处理,因为set有去重的功能,而且set是利用红黑树实现的,查找速度快O(logN). 代码如下: #include<cst ...
- PAT天梯赛L2-005 集合相似度
题目链接:点击打开链接 给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的 ...
- PAT 天梯赛 L2-005. 集合相似度 【SET】
题目链接 https://www.patest.cn/contests/gplt/L2-005 思路 因为集合中的元素 是不重复的 所以用SET 来保存 集合 然后最后 查找一下 两个集合中共有元素 ...
- 天梯赛 L2-005 集合相似度 (set容器)
给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的相似度. 输入格式: 输 ...
- 天梯赛 - L2-005 集合相似度
题目链接:https://www.patest.cn/contests/gplt/L2-005 这个题理解是个大问题啊,“给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合 ...
- PAT天梯赛 L1-049 天梯赛座位分配
题目链接:点击打开链接 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] ...
- PAT L1 049 天梯赛座位分配
天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位 ...
- PAT天梯赛L3-007 天梯地图
题目链接:点击打开链接 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校所在地和赛场地点后,该地图应该推荐两条路线:一条是最快到达路线:一条是最短距离的路线.题目保证对任意的查询请求,地图上都至 ...
- pat 团体天梯赛 L3-007. 天梯地图
L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...
随机推荐
- PEP 476 -- Enabling certificate verification by default for stdlib http clients
SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate ch ...
- nginx报警:nginx: [warn] could not build optimal server_names_hash, you should increase either server_names_hash_max_size: 512 or server_names_hash_bucket_size: 64; ignoring server_names_hash_bucket_size
date: 2019-08-12 16:33:05 author: headsen chen notice :个人原创 告警现象: 解决办法:在http的部分添加hash缓冲值 测试:如下图, ...
- js 解析 JSON 数据
JSON 数据如下: { "name": "mkyong", , "address": { "streetAddress" ...
- Linux系统的关机、重启、睡眠
一.关机.重启前的准备1.查看网络联机状态.后台可执行程序 查看一下两样东西,可以让你稍微了解主机目前的使用状态 查看网络联机状态:netstat -a查看后台执行的程序:ps -aux2.数据同 ...
- 【Mybatis】MyBatis之配置多数据源(十)
在做项目的过程中,有时候一个数据源是不够,那么就需要配置多个数据源.本例介绍mybatis多数据源配置 前言 一般项目单数据源,使用流程如下: 单个数据源绑定给sessionFactory,再在Dao ...
- 单独使用MyBatis的简单示例
单独使用MyBatis的简单示例:mybaties-config.xml:MyBatis配置文件 <?xml version="1.0" encoding="UTF ...
- 【Leetcode_easy】1030. Matrix Cells in Distance Order
problem 1030. Matrix Cells in Distance Order 参考 1. Leetcode_easy_1030. Matrix Cells in Distance Orde ...
- upload-labs 上传漏洞靶场环境以及writeup
一个帮你总结所有类型的上传漏洞的靶场 https://github.com/c0ny1/upload-labs 靶场环境(基于phpstudy这个php集成环境) https://github.com ...
- 服务发现框架选型,Consul还是Zookeeper还是etcd
背景 本文并不介绍服务发现的基本原理.除了一致性算法之外,其他并没有太多高深的算法,网上的资料很容易让大家明白上面是服务发现. 想直接查看结论的同学,请直接跳到文末. 目前,市面上有非常多的服务发现工 ...
- AMSR-E/AMSR-2数据介绍与下载
1 AMSR-E数据介绍 The Advanced Microwave Scanning Radiometer for EOS (AMSR-E)是ADEOS-II 上的AMSR的改进版本, 是JAXA ...