博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cow Routing(最短路spfa)
阅读量:5290 次
发布时间:2019-06-14

本文共 2568 字,大约阅读时间需要 8 分钟。

题:https://www.luogu.org/problem/P3115

题意:给出起点A,终点B,N条路线,下面没俩行一个路线,第一行是俩个数,第一个为这条路线的花费,第二个为这条路线经过的点数n,第二行即为n个整数表示这条路径;

分析:1、题目有说如果要跳转航线就要花费被跳往航线的的费用,所以单单连一条中转的边是错的;

   2、题目范围1000,所以我们暴力建边,但也要建得有思路,对于每一条航线,如果你一直在这条航线上走,花费都是不变的(即为这条航线的cost),所以我们可以认为,对于这条航线的每一个点 i 都可以直接花费cost到 i 后面的点 j ,所以就预处理最小花费和经 过的点数,再添加图的边;

   3、最后spfa一下就好,花费为第一优先级,经过的点数为第二优先级;

#include
using namespace std;inline int read(){ int sum=0,x=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') x=0; ch=getchar(); } while(ch>='0'&&ch<='9') sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar(); return x?sum:-sum;}inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}typedef long long ll;const int inf=0x3f3f3f3f;const ll INF=1e18;const int M=1e3+3;int maxx=0,tot,head[M],vis[M],a[M];ll dis[M][2],cost[M][M],path[M][M];struct node{ int v,nextt; ll cost,w;}e[M*M];void addedge(int u,int v,ll w,ll cost){ e[tot].v=v; e[tot].w=w; e[tot].cost=cost; e[tot].nextt=head[u]; head[u]=tot++;}void spfa(int s,int t){ for(int i=0;i<=1000;i++) dis[i][0]=INF; queue
que; que.push(s); dis[s][0]=0; while(!que.empty()){ int u=que.front(); que.pop(); vis[u]=0; for(int i=head[u];~i;i=e[i].nextt){ int v=e[i].v; if(dis[v][0]>dis[u][0]+e[i].w){ dis[v][0]=dis[u][0]+e[i].w; dis[v][1]=dis[u][1]+e[i].cost; if(!vis[v]){ vis[v]=1; que.push(v); } } else if(dis[v][0]==dis[u][0]+e[i].w){ if(dis[v][1]>dis[u][1]+e[i].cost) dis[v][1]=dis[u][1]+e[i].cost; } } } if(dis[t][0]==INF) printf("-1 -1\n"); else printf("%lld %lld\n",dis[t][0],dis[t][1]);}int main(){ int A=read(),B=read(),t=read(); memset(head,-1,sizeof(head)); for(int i=0;i<=1000;i++) for(int j=0;j<=1000;j++) cost[i][j]=inf; maxx=0; while(t--){ int w=read(),n=read(); for(int i=1;i<=n;i++) a[i]=read(),maxx=max(maxx,a[i]); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(cost[a[i]][a[j]]>w){ cost[a[i]][a[j]]=w; path[a[i]][a[j]]=j-i; } } for(int i=1;i<=maxx;i++) for(int j=1;j<=maxx;j++) if(cost[i][j]
View Code

 

转载于:https://www.cnblogs.com/starve/p/11462488.html

你可能感兴趣的文章
B/S神思SS628(100)身份证阅读器开发
查看>>
Do What you want
查看>>
IPv6 关于路由器配置静态IPv6路由的命令
查看>>
查看linux 用户登录信息及ip
查看>>
Linux系统测试端口连通性的方法
查看>>
联想think system sr550信息
查看>>
linux系统物理cpu信息查询
查看>>
shell 符号的定义(一)
查看>>
开源网络漏洞扫描软件
查看>>
yum 命令跳过特定(指定)软件包升级方法
查看>>
Python学习笔记(三)——类型与变量
查看>>
比较表变量和临时表
查看>>
为什么判断UITextField判断为空不能用isEqualToString:@""
查看>>
Spring框架的事务管理的分类
查看>>
Mysql Join语法以及性能优化
查看>>
【干货】移动端基础知识技巧总结
查看>>
python高级-面向对象(11)
查看>>
《算法导论》插入排序
查看>>
如何使用PL/SQL工具批量导出表、存储过程、序列
查看>>
手游帧同步的研究[转]
查看>>