PAT-1111 Online Map (30分) 最短路+dfs

时间:2022-09-11 23:37:50

明天就要考PAT,为了应付期末已经好久没有刷题了啊啊啊啊,今天开了一道最短路,状态不是很好

1.没有读清题目要求,或者说没有读完题目,明天一定要注意

2.vis初始化的时候从1初始化到n,应该从0开始,以后初始化就从0到n即可

题目大意:给一张地图,两个结点中既有距离也有时间,有的单行有的双向,要求根据地图推荐两条路线:一条是最快到达路线,一条是最短距离的路线。

第一行给出两个整数N和M,表示地图中地点的个数和路径的条数。接下来的M行每一行给出:道路结点编号V1 道路结点编号V2 是否单行线 道路长度 所需时间

要求第一行输出最快到达时间Time和路径,第二行输出最短距离Distance和路径

就用两次dij+dfs即可,好嘛,今晚dfs也不用练了.最好明天出一道这道题

#include <iostream>
#include<bits/stdc++.h>
#define each(a,b,c) for(int a=b;a<=c;a++)
#define de(x) cout<<#x<<" "<<(x)<<endl
using namespace std; const int maxn=500+5;
const int inf=0x3f3f3f3f; int T[maxn][maxn];
int dis1[maxn];
int dis2[maxn];
bool vis[maxn];
int n,m,from,to;
vector<int>pre1[maxn],pre2[maxn];
/// vis =0 从0开始
struct edge
{
int v;
int length;
int time;
edge(int v,int length,int time):v(v),length(length),time(time){}
};
vector<edge>G[maxn];
struct node
{
int v;
int len;
node(int v=0,int len=0):v(v),len(len){}
bool operator<(const node&r)const
{
return len>r.len;
} };
void dijkstra1(int start,int n)
{
for(int i=0;i<=n;i++)
{
vis[i]=false;
dis1[i]=inf;
}
dis1[start]=0;
priority_queue<node>Q;
Q.push(node(start,0));
node temp;
while(!Q.empty())
{
temp=Q.top();
Q.pop();
int u=temp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i].v;
int len=G[u][i].length;
if(!vis[v]&&dis1[v]>dis1[u]+len)
{
dis1[v]=dis1[u]+len;
pre1[v].clear();
pre1[v].push_back(u);
Q.push(node(v,dis1[v]));
}
else if(!vis[v]&&dis1[v]==dis1[u]+len)
{
pre1[v].push_back(u);
}
}
}
}
void dijkstra2(int start,int n)
{
for(int i=0;i<=n;i++)
{
vis[i]=false;
dis2[i]=inf;
}
dis2[start]=0;
priority_queue<node>Q;
while(!Q.empty())Q.pop();
Q.push(node(start,0)); node temp;
while(!Q.empty())
{
temp=Q.top();
Q.pop();
int u=temp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i].v;
int len=G[u][i].time;
if(!vis[v]&&dis2[v]>dis2[u]+len)
{
dis2[v]=dis2[u]+len;
pre2[v].clear();
pre2[v].push_back(u);
Q.push(node(v,dis2[v]));
}
else if(!vis[v]&&dis2[v]==dis2[u]+len)
{
pre2[v].push_back(u);
}
}
}
}
vector<int>path;
vector<int>ans_path;
vector<int>ans_path2;
int min_time=inf;
void dfs1(int v)
{
path.push_back(v);
if(v==from)
{
int temp=0;
for(int i=0;i<path.size()-1;i++)
{
temp+=T[path[i+1]][path[i]];
}
if(temp<min_time)
{
min_time=temp;///忘记更新最小值了\吐血
ans_path=path;
}
path.pop_back();
return ;
}
for(int i=0;i<pre1[v].size();i++)
{
dfs1(pre1[v][i]);
}
path.pop_back(); }
int max_n=maxn;
void dfs2(int v)
{
path.push_back(v);
if(v==from)
{
if(path.size()<max_n)
{
max_n=path.size();
ans_path2=path;
}
path.pop_back();
return;
}
for(int i=0;i<pre2[v].size();i++)
{
dfs2(pre2[v][i]);
}
path.pop_back();
} /*
V1 V2 one-way length time
10 15
0 1 0 1 1
8 0 0 1 1
4 8 1 1 1
3 4 0 3 2
3 9 1 4 1
0 6 0 1 1
7 5 1 2 1
8 5 1 2 1
2 3 0 2 2
2 1 1 1 1
1 3 0 3 1
1 4 0 1 1
9 7 1 3 1
5 1 0 5 2
6 5 1 1 2
3 5
*/
int main()
{
cin>>n>>m;
int v1,v2,flag,len,time;
each(i,1,m)
{
cin>>v1>>v2>>flag>>len>>time;
if(flag==1)
{
G[v1].push_back(edge(v2,len,time));
T[v1][v2]=T[v2][v1]=time;
}
else
{
G[v1].push_back(edge(v2,len,time));
G[v2].push_back(edge(v1,len,time));
T[v1][v2]=T[v2][v1]=time;
}
}
cin>>from>>to;
dijkstra1(from,n);
dijkstra2(from,n);
//de(dis1[to]);
//de(dis2[to]);
dfs1(to);
dfs2(to);
printf("Distance = %d", dis1[to]);
if(ans_path == ans_path2) {
printf("; Time = %d: ", dis2[to]);
} else {
printf(": ");
for(int i = ans_path.size() - 1; i >= 0; i--) {
printf("%d", ans_path[i]);
if(i != 0) printf(" -> ");
}
printf("\nTime = %d: ", dis2[to]);
}
for(int i = ans_path2.size() - 1; i >= 0; i--) {
printf("%d", ans_path2[i]);
if(i != 0) printf(" -> ");
}
/*
Distance = 6: 3 -> 4 -> 8 -> 5
Time = 3: 3 -> 1 -> 5
*/
}

PAT-1111 Online Map (30分) 最短路+dfs的更多相关文章

  1. 【PAT甲级】1111 Online Map &lpar;30分&rpar;(dijkstra&plus;路径记录)

    题意: 输入两个正整数N和M(N<=500,M<=N^2),分别代表点数和边数.接着输入M行每行包括一条边的两个结点(0~N-1),这条路的长度和通过这条路所需要的时间.接着输入两个整数表 ...

  2. PAT-1030 Travel Plan &lpar;30 分&rpar; 最短路最小边权 堆优化dijkstra&plus;DFS

    PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...

  3. PAT 1111 Online Map&lbrack;Dijkstra&rsqb;&lbrack;dfs&rsqb;

    1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...

  4. PAT 1004 Counting Leaves &lpar;30分&rpar;

    1004 Counting Leaves (30分) A family hierarchy is usually presented by a pedigree tree. Your job is t ...

  5. &lbrack;PAT&rsqb; 1147 Heaps(30 分)

    1147 Heaps(30 分) In computer science, a heap is a specialized tree-based data structure that satisfi ...

  6. PAT 甲级 1147 Heaps &lpar;30 分&rpar; &lpar;层序遍历,如何建树,后序输出,还有更简单的方法~&rpar;

    1147 Heaps (30 分)   In computer science, a heap is a specialized tree-based data structure that sati ...

  7. PAT 甲级1057 Stack &lpar;30 分&rpar;(不会,树状数组&plus;二分)&ast;&ast;&ast;&ast;&ast;

    1057 Stack (30 分)   Stack is one of the most fundamental data structures, which is based on the prin ...

  8. PAT 甲级 1018 Public Bike Management &lpar;30 分&rpar;(dijstra&plus;dfs&comma;dfs记录路径&comma;做了两天)

    1018 Public Bike Management (30 分)   There is a public bike service in Hangzhou City which provides ...

  9. PTA 1004 Counting Leaves &lpar;30&rpar;(30 分)(dfs或者bfs)

    1004 Counting Leaves (30)(30 分) A family hierarchy is usually presented by a pedigree tree. Your job ...

随机推荐

  1. &lbrack;Sass&rsqb;占位符 &percnt;placeholder

    [Sass]占位符 %placeholder Sass 中的占位符 %placeholder 功能是一个很强大,很实用的一个功能,这也是我非常喜欢的功能.他可以取代以前 CSS 中的基类造成的代码冗余 ...

  2. jdbc的基本应用

    JDBC-----英文全称--------Java Data Base Connectivity是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写 ...

  3. &lbrack;转载&rsqb;MySQL5&period;5 配置文件 my&period;ini 1067错误

    原文链接:http://blog.csdn.net/xiaochunyong/article/details/7438200 解压mysql-5.5.22-win32.zip后的目录中有5个my-xx ...

  4. 用&period;Net Mage工具更新WPF ClickOnce应用程序部署清单

    Wpf程序在iis上发布后的文件结构.不像asp.net可以直接在服务器上修改网站目录的web.config文件或其他文件,wpf发布的结构是.application文件和一个Application ...

  5. koa 笔记 运行错误

    按照 演示的代码 直接运行会出错,大家需要调整方式. http://koajs.cn/ 要安装以下 $ npm install -g n$ n 0.11.12$ node --harmony my-k ...

  6. 大约Android PopupWindow有用Spinner控件点击APP Crash案例整理!

    场景异常,如下面: android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.V ...

  7. temp--达州银行

    达州银行现场 服务器IP地址 192.168.1.234 ilink / ilink 自己电脑需要设置为固定IP 192.168.1.XXX 子网掩码 255.255.255.0 192.168.1. ...

  8. mysql 两个时间段的差&comma;可以是秒&comma;天&comma;星期&comma;月份&comma;年&period;&period;&period;

    SELECT TIMESTAMPDIFF(SECOND, now(), "2012-11-11 00:00:00") 语法为:TIMESTAMPDIFF(unit,datetime ...

  9. Ubuntu 下的QQ WECHAT FOXMAIL解决方案

    原文链接: https://www.lulinux.com/archives/1319 真心很强大. Ubuntu系发行版*安装deepin wine QQ的步骤 1,安装deepin-wine环境: ...

  10. vue路由的钩子函数和跳转

    首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改.一些需要登录才能调整页面的重定向功能. beforeEach主要有3个参数to,from,next. t ...