PAT (Advanced Level) 1111. Online Map (30)
预处理出最短路再进行暴力dfs求答案会比较好。直接dfs效率太低。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std; int n,m;
int st,en;
struct Edge
{
int u,v,len,time;
}e[+];
int tot=;
vector<int>g[];
int Dis[],Tim[];
bool flag[]; int ans_len,ans_time,ans_sz,ans_count;
int path[],ans_path[]; vector<int>p1,p2;
int Distance,Time; void addedge(int u,int v,int len,int time)
{
e[tot].u=u; e[tot].v=v; e[tot].len=len; e[tot].time=time;
g[u].push_back(tot++);
} void SPFA(int s)
{
queue<int>Q;
memset(flag,,sizeof flag);
for(int i=;i<=n;i++) Dis[i]=;
Q.push(s); flag[s]=; Dis[s]=;
while(!Q.empty())
{
int head=Q.front(); Q.pop(); flag[head]=;
for(int i=;i<g[head].size();i++)
{
int id=g[head][i];
if(Dis[head]+e[id].len<Dis[e[id].v])
{
Dis[e[id].v]=Dis[head]+e[id].len;
if(flag[e[id].v]==)
{
flag[e[id].v]=;
Q.push(e[id].v);
}
}
}
} memset(flag,,sizeof flag);
for(int i=;i<=n;i++) Tim[i]=;
Q.push(s); flag[s]=; Tim[s]=;
while(!Q.empty())
{
int head=Q.front(); Q.pop(); flag[head]=;
for(int i=;i<g[head].size();i++)
{
int id=g[head][i];
if(Tim[head]+e[id].time<Tim[e[id].v])
{
Tim[e[id].v]=Tim[head]+e[id].time;
if(flag[e[id].v]==)
{
flag[e[id].v]=;
Q.push(e[id].v);
}
}
}
}
} void dfs1(int x,int len,int time,int dep)
{
if(len>ans_len) return; if(x==en)
{
if(len<ans_len)
{
ans_len=len;
ans_time=time;
ans_sz=dep;
for(int i=;i<dep;i++)
ans_path[i]=path[i];
}
else if(len==ans_len)
{
if(time<ans_time)
{
ans_time=time;
ans_sz=dep;
for(int i=;i<dep;i++)
ans_path[i]=path[i];
}
}
return;
}
for(int i=;i<g[x].size();i++)
{
int id=g[x][i];
path[dep]=e[id].v;
if(Dis[x]+e[id].len>Dis[e[id].v]) continue;
dfs1(e[id].v,len+e[id].len,time+e[id].time,dep+);
}
} void dfs2(int x,int time,int count,int dep)
{
if(time>ans_time) return; if(x==en)
{
if(time<ans_time)
{
ans_time=time;
ans_count=count;
ans_sz=dep;
for(int i=;i<dep;i++)
ans_path[i]=path[i];
}
else if(time==ans_time)
{
if(count<ans_count)
{
ans_count=count;
ans_sz=dep;
for(int i=;i<dep;i++)
ans_path[i]=path[i];
}
}
return;
}
for(int i=;i<g[x].size();i++)
{
int id=g[x][i];
path[dep]=e[id].v;
if(Tim[x]+e[id].time>Tim[e[id].v]) continue;
dfs2(e[id].v,time+e[id].time,count+,dep+);
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int u,v,f,len,time;
scanf("%d%d%d%d%d",&u,&v,&f,&len,&time);
addedge(u,v,len,time);
if(f==) addedge(v,u,len,time);
}
scanf("%d%d",&st,&en); SPFA(st); for(int i=;i<=n;i++) flag[i]=;
ans_len=;
ans_time=; flag[st]=;
dfs1(st,,,); Distance = ans_len;
p1.push_back(st);
for(int i=;i<ans_sz;i++) p1.push_back(ans_path[i]); for(int i=;i<=n;i++) flag[i]=;
ans_time=;
ans_count=; flag[st]=;
dfs2(st,,,); Time=ans_time;
p2.push_back(st);
for(int i=;i<ans_sz;i++) p2.push_back(ans_path[i]); bool fail=;
if(p1.size()!=p2.size()) fail=;
else {
for(int i=;i<p1.size();i++)
if(p1[i]!=p2[i]) fail=;
} if(fail==)
{
printf("Distance = %d; Time = %d: ",Distance,Time);
for(int i=;i<p1.size();i++)
{
printf("%d",p1[i]);
if(i<p1.size()-) printf(" -> ");
else printf("\n");
}
}
else
{
printf("Distance = %d: ",Distance);
for(int i=;i<p1.size();i++)
{
printf("%d",p1[i]);
if(i<p1.size()-) printf(" -> ");
else printf("\n");
} printf("Time = %d: ",Time);
for(int i=;i<p2.size();i++)
{
printf("%d",p2[i]);
if(i<p2.size()-) printf(" -> ");
else printf("\n");
} }
return ;
}
PAT (Advanced Level) 1111. Online Map (30)的更多相关文章
- PAT (Advanced Level) 1107. Social Clusters (30)
简单并查集. #include<cstdio> #include<cstring> #include<cmath> #include<vector> # ...
- PAT (Advanced Level) 1103. Integer Factorization (30)
暴力搜索. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- PAT (Advanced Level) 1072. Gas Station (30)
枚举一下选的位置,每次算一下就可以了. #include<cstdio> #include<cstring> #include<cmath> #include< ...
- PAT (Advanced Level) 1049. Counting Ones (30)
数位DP.dp[i][j]表示i位,最高位为j的情况下总共有多少1. #include<iostream> #include<cstring> #include<cmat ...
- PAT (Advanced Level) 1091. Acute Stroke (30)
BFS求连通块.递归会爆栈. #include<cstdio> #include<cstring> #include<cmath> #include<algo ...
- PAT (Advanced Level) 1026. Table Tennis (30)
情况比较多的模拟题. 交了50发的样子才AC......AC之后我的天空星星都亮了. #include<iostream> #include<cstring> #include ...
- PAT (Advanced Level) 1022. Digital Library (30)
简单模拟题. 写的时候注意一些小优化,小心TLE. #include<iostream> #include<cstring> #include<cmath> #in ...
- PAT (Advanced Level) 1080. Graduate Admission (30)
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...
- PAT (Advanced Level) 1030. Travel Plan (30)
先处理出最短路上的边.变成一个DAG,然后在DAG上进行DFS. #include<iostream> #include<cstring> #include<cmath& ...
随机推荐
- Html 嵌入 swf
1. object + embed 传统的方法 优点:浏览器兼容性好,是 Macromedia 一直以来的官方方法缺点:a.embed 标签是不符合 W3C 的规范的,无法通过验证.当然, ...
- Neutron网络性能测试与分析(一) CVR
测试环境:网络节点运行在Intel(R) Xeon(R) CPU E5-2630 v3服务器上,网卡使用intel的万兆卡82599ES 测试仪使用本人基于dpdk编写的程序,基本上可以打满万兆卡,小 ...
- Flask -- 使用数据库(Sqlite3)、用户注册、登录注销、修改密码
# 使用sqlite数据库 import sqlite3from contextlib import closing app.config.update( DATABASE = 'my.db', #相 ...
- android:layout_weight属性的使用方法总结
原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6282826.html android:layout_weight属性可以和其他属性配合使用,产生多 ...
- 《Windows驱动开发技术详解》之自定义StartIO
自定义StartIO 系统定义的StartIO队列只能使用一个队列(DDK提供的StartIO内部只有一个队列),这个队列将所有的IRP进行处理化.例如,读.写操作都会混在一起进行串行处理.然而,有时 ...
- hdu_2665_Kth number(主席树)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2665 题意:给你一个区间,让你找这个区间第K大的数 题解:主席树模版题,也可以用划分树 #includ ...
- ECOS-认证地址
ECOS系统授权认证,需要和Shopex认证中心互联.当服务器DNS无效时.需要绑定host强行解析服务器强行解析以下vim /etc/hosts 122.144.135.142 service.sh ...
- svn revert
本地开发环境出现一个问题,用revert完美解决. 问题描述: 文件static/image/common/jiqiaodaren.png已经被提交到svn上,但是我的开发环境因未与svn同步,所以没 ...
- Heartbeat+DRBD+MySQL高可用方案【转】
转自Heartbeat+DRBD+MySQL高可用方案 - yayun - 博客园 http://www.cnblogs.com/gomysql/p/3674030.html 1.方案简介 本方案采用 ...
- “Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED”
1. 有可能你的客户端已经安装过了,需要移调才能安装2. 你的清单文件AndroidManifest.xml写的有问题,检查一下