【图论】最短路应用

server/2024/9/25 7:04:24/

1135. 新年好

  •    题目
  •    提交记录
  •    讨论
  •    题解
  •    视频讲解

MarkDown视图Copy

重庆城里有 nn 个车站,mm 条 双向 公路连接其中的某些车站。

每两个车站最多用一条公路连接,从任何一个车站出发都可以经过一条或者多条公路到达其他车站,但不同的路径需要花费的时间可能不同。

在一条路径上花费的时间等于路径上所有公路需要的时间之和。

佳佳的家在车站 11,他有五个亲戚,分别住在车站 a,b,c,d,ea,b,c,d,e。

过年了,他需要从自己的家出发,拜访每个亲戚(顺序任意),给他们送去节日的祝福。

怎样走,才需要最少的时间?

输入格式

第一行:包含两个整数 n,mn,m,分别表示车站数目和公路数目。

第二行:包含五个整数 a,b,c,d,ea,b,c,d,e,分别表示五个亲戚所在车站编号。

以下 mm 行,每行三个整数 x,y,tx,y,t,表示公路连接的两个车站编号和时间。

输出格式

输出仅一行,包含一个整数 TT,表示最少的总时间。

数据范围

1≤n≤500001≤n≤50000,
1≤m≤1051≤m≤105,
1<a,b,c,d,e≤n1<a,b,c,d,e≤n,
1≤x,y≤n1≤x,y≤n,
1≤t≤1001≤t≤100

输入样例:

Copy

6 6
2 3 4 5 6
1 2 8
2 3 3
3 4 4
4 5 5
5 6 2
1 6 7
输出样例:

Copy

21
#include<iostream>
#include<cstring>
#include<queue>
#define pii pair<int,int>
using namespace std;
#define INF 0x3f3f3f3f
const int M=100010;const int N=50010;
struct EDGE{int next;int to;int w;
}edge[2*M];int tot=0;
int n,m;int head[N];
void add(int u,int v,int w){edge[++tot].next=head[u];edge[tot].to=v;edge[tot].w=w;head[u]=tot;
}int ans=INF;
int A[6];
int dis[6][6];
void dijk(int ss){int s=A[ss];int dist[N];bool st[N]={0};memset(dist,INF,sizeof(dist));priority_queue<pii,vector<pii>,greater<pii>>heap;heap.push({0,s});dist[s]=0;while(!heap.empty()){pii temp=heap.top();heap.pop();int x=temp.first;int y=temp.second;if(st[y])continue;st[y]=1;for(int i=head[y];~i;i=edge[i].next){//cout<<"jin"<<endl;int v=edge[i].to;if(dist[v]>x+edge[i].w){dist[v]=x+edge[i].w;heap.push({dist[v],v});}}}for(int i=0;i<=5;i++){dis[ss][i]=dis[i][ss]=dist[A[i]];}
}int B[6];bool book[6];
void dfs(int step){if(step==6){int res=0;//cout<<"B";for(int i=1;i<=5;i++){// 1 2 3 4 5dfs编号//B 亲戚 1 2 3 4 5 编号//A 结点编号//cout<<A[B[i]]<<" ";//cout<<dis[B[i-1]][B[i]]<<" ";res+=dis[B[i-1]][B[i]];}//cout<<res<<endl;ans=min(ans,res);return ;}for(int i=1;i<=5;i++){if(!book[i]){book[i]=1;B[step]=i;dfs(step+1);book[i]=0;}}}int main(){cin>>n>>m;memset(head,-1,sizeof(head));A[0]=1;for(int i=1;i<=5;i++)cin>>A[i];while(m--){int u,v,w;cin>>u>>v>>w;add(u,v,w);add(v,u,w);}for(int i=0;i<=5;i++){dijk(i);}B[0]=0;dfs(1);cout<<ans<<endl;}

 

340. 通信线路

  •    题目
  •    提交记录
  •    讨论
  •    题解
  •    视频讲解

MarkDown视图Copy

在郊区有 NN 座通信基站,PP 条 双向 电缆,第 ii 条电缆连接基站 AiAi 和 BiBi。

特别地,11 号基站是通信公司的总站,NN 号基站位于一座农场中。

现在,农场主希望对通信线路进行升级,其中升级第 ii 条电缆需要花费 LiLi。

电话公司正在举行优惠活动。

农产主可以指定一条从 11 号基站到 NN 号基站的路径,并指定路径上不超过 KK 条电缆,由电话公司免费提供升级服务。

农场主只需要支付在该路径上剩余的电缆中,升级价格最贵的那条电缆的花费即可。

求至少用多少钱可以完成升级。

输入格式

第 11 行:三个整数 N,P,KN,P,K。

第 2..P+12..P+1 行:第 i+1i+1 行包含三个整数 Ai,Bi,LiAi,Bi,Li。

输出格式

包含一个整数表示最少花费。

若 11 号基站与 NN 号基站之间不存在路径,则输出 −1−1。

数据范围

0≤K<N≤10000≤K<N≤1000,
1≤P≤100001≤P≤10000,
1≤Li≤10000001≤Li≤1000000

输入样例:

Copy

5 7 1
1 2 5
3 1 4
2 4 8
3 2 3
5 2 9
3 4 7
4 5 6
输出样例:

Copy

4
难度:中等
时/空限制:1s / 64MB
总通过数:14023
总尝试数:27405
来源:

算法竞赛进阶指南》USACO2008

算法标签

分层图 

#include<iostream>
using namespace std;
#include<cstring>#define ll long long
#define INF 0x3f3f3f3f
#include<queue>
#define pll pair<ll,ll>
ll n,m,k;
const ll M=10010*4*1010;
const ll N=1010*1010;
struct EDGE{ll next;ll to;ll w;
}edge[2*M];
ll head[N];ll tot=0;
void add(ll u,ll v,ll w){
edge[++tot].next=head[u];
edge[tot].to=v;
edge[tot].w=w;
head[u]=tot;
}ll dist[N];bool st[N];
void dijk(ll s){memset(dist,INF,sizeof(dist));priority_queue<pll,vector<pll>,greater<pll>> heap;heap.push({0,s});dist[s]=0;while(!heap.empty()){pll temp=heap.top();heap.pop();ll d=temp.first;ll u=temp.second;if(st[u])continue;st[u]=1;for(ll i=head[u];~i;i=edge[i].next){ll v=edge[i].to;//一个可以被更新dist[v]>//被更新为多少max(d,)if(dist[v]>max(d,edge[i].w)){dist[v]=max(d,edge[i].w);heap.push({dist[v],v});}}}
}int  main(){cin>>n>>m>>k;memset(head,-1,sizeof(head));while(m--){ll u,v,w;cin>>u>>v>>w;for(ll j=1;j<=k;j++){add(u+(j-1)*n,v+j*n,0);add(v+(j-1)*n,u+j*n,0);}for(ll j=0;j<=k;j++){add(u+j*n,v+j*n,w);add(v+j*n,u+j*n,w);}}dijk(1);ll ans=INF;for(ll j=0;j<=k;j++){ans=min(ans,dist[n+j*n]);}cout<<ans;
}

二分+dijk 

#include<iostream>
using namespace std;
#include<queue>
#define pii pair<int,int>
#define INF 0x3f3f3f3f
#include<cstring>
const int M=10010;
const int N=1010;
int n,m,k;
struct EDGE{int next;int to;int w;
}edge[2*M];
int head[N];int tot=0;
void add(int u,int v,int w){edge[++tot].next=head[u];edge[tot].to=v;edge[tot].w=w;head[u]=tot;
}bool check(int mid){priority_queue<pii,vector<pii>,greater<pii>> heap;bool st[N]={0};int dist[N];memset(dist,INF,sizeof(dist));heap.push({0,1});dist[1]=0;while(!heap.empty()){pii temp=heap.top();heap.pop();int d=temp.first;int u=temp.second;if(st[u])continue;st[u]=1;for(int i=head[u];~i;i=edge[i].next){int v=edge[i].to;int w=(edge[i].w>mid);if(dist[v]>d+w){dist[v]=d+w;heap.push({dist[v],v});}}}//mid大,比他大的就会少return dist[n]<=k;}int main()
{memset(head,-1,sizeof(head));cin>>n>>m>>k;while(m--){int u,v,w;cin>>u>>v>>w;add(u,v,w);add(v,u,w);}int l=0,r=1e7+10;while(l<r){int mid=(l+r)>>1;if(check(mid))r=mid;else l=mid+1;}if(l==1e7+10)cout<<-1;else cout<<l;
}

 

 

342. 道路与航线

  •    题目
  •    提交记录
  •    讨论
  •    题解
  •    视频讲解

MarkDown视图Copy

农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查。

他想把牛奶送到 TT 个城镇,编号为 1∼T1∼T。

这些城镇之间通过 RR 条道路 (编号为 11 到 RR) 和 PP 条航线 (编号为 11 到 PP) 连接。

每条道路 ii 或者航线 ii 连接城镇 AiAi 到 BiBi,花费为 CiCi。

对于道路,0≤Ci≤10,0000≤Ci≤10,000;然而航线的花费很神奇,花费 CiCi 可能是负数(−10,000≤Ci≤10,000−10,000≤Ci≤10,000)。

道路是双向的,可以从 AiAi 到 BiBi,也可以从 BiBi 到 AiAi,花费都是 CiCi。

然而航线与之不同,只可以从 AiAi 到 BiBi。

事实上,由于最近恐怖主义太嚣张,为了社会和谐,出台了一些政策:保证如果有一条航线可以从 AiAi 到 BiBi,那么保证不可能通过一些道路和航线从 BiBi 回到 AiAi。

由于约翰的奶牛世界公认十分给力,他需要运送奶牛到每一个城镇。

他想找到从发送中心城镇 SS 把奶牛送到每个城镇的最便宜的方案。

输入格式

第一行包含四个整数 T,R,P,ST,R,P,S。

接下来 RR 行,每行包含三个整数(表示一个道路)Ai,Bi,CiAi,Bi,Ci。

接下来 PP 行,每行包含三个整数(表示一条航线)Ai,Bi,CiAi,Bi,Ci。

输出格式

第 1..T1..T 行:第 ii 行输出从 SS 到达城镇 ii 的最小花费,如果不存在,则输出 NO PATH

数据范围

1≤T≤250001≤T≤25000,
1≤R,P≤500001≤R,P≤50000,
1≤Ai,Bi,S≤T1≤Ai,Bi,S≤T

输入样例:

Copy

6 3 3 4
1 2 5
3 4 5
5 6 10
3 5 -100
4 6 -100
1 3 -10
输出样例:

Copy

NO PATH
NO PATH
5
0
-95
-100

 


http://www.ppmy.cn/server/121702.html

相关文章

JavaWeb--纯小白笔记06:使用Idea创建Web项目,Servlet生命周期,注解,中文乱码解决

使用Idea创建一个web项目----详细步骤配置&#xff0c;传送门&#xff1a;http://t.csdnimg.cn/RsOs7 src&#xff1a;放class文件 web&#xff1a;放html文件 out&#xff1a;运行过后产生的文件 一创建一个新的web项目(配置好了后)&#xff1a; 在src创建一个文件…

MySQL数据库脚本转化成sqlite数据库脚本的修改点

转换数据类型 将MySQL的数据类型转换为SQLite对应的数据类型。例如&#xff0c;将 INT或 INTEGER 转换为 INTEGER&#xff0c;将 VARCHAR、TEXT 或 CHAR 转换为 TEXT&#xff0c;将 DATETIME 或 TIMESTAMP 转换为 TEXT 或 DATETIME&#xff08;SQLite没有专门的日期时间类型&am…

Java_Day06学习

抽象类 1.定义&#xff1a;Java也可以创建一种类专门用来当作父类&#xff0c;这种类称为“抽象类”&#xff1b; //抽象类的作用有点类似“模版”&#xff0c;其目的是要设计者依据它的格式来修改并创建新的类。但是并不能直接由抽象类创建对象&#xff0c;只能通过抽象类派生…

JSP(Java Server Pages)基础使用二

简单练习在jsp页面上输出出乘法口诀表 既然大家都是来看这种代码的人了&#xff0c;那么这种输出乘法口诀表的这种简单算法肯定是难不住大家了&#xff0c;所以这次主要是来说jsp的使用格式问题。 <%--Created by IntelliJ IDEA.User: ***Date: 2024/7/18Time: 11:26To ch…

Python Web 与物联网(IoT)集成与实时数据处理

Python Web 与物联网&#xff08;IoT&#xff09;集成与实时数据处理 目录 &#x1f310; IoT 与 Python 的集成&#x1f4e1; 使用 Flask/FastAPI 构建 IoT 中的 Web 接口与控制面板&#x1f517; 使用 MQTT 协议与 Paho 库进行设备间通信&#x1f5c4;️ 在 Python 中处理传…

浅析OceanBase数据库的向量化执行引擎

本篇博客是偏数据库系统概念性的内容&#xff0c;不会深入到 OceanBase 中各个算子和表达式的在向量化中的详细设计和实现。 背景 为了提升OceanBase社区版用户解决问题的效率&#xff0c;OceanBase官方不久前推出了《OceanBase 从入门到实践》系列课程。在第七期直播课程后&a…

基于 K8S kubernetes 搭建 安装 EFK日志收集平台

目录 1、在k8s中安装EFK组件 1.1 安装elasticsearch组件 1.2 安装kibana组件 1.3 安装fluentd组件 文档中的YAML文件配置直接复制粘贴可能存在格式错误&#xff0c;故实验中所需要的YAML文件以及本地包均打包至网盘 链接&#xff1a;https://pan.baidu.com/s/15Ryaoa0_…

Leetcode 螺旋矩阵

算法思想&#xff1a; 这个算法的目标是按照顺时针螺旋的顺序从矩阵中取出元素。为了做到这一点&#xff0c;整个思路可以分成几个关键步骤&#xff1a; 定义边界&#xff1a;首先需要定义四个边界变量&#xff1a; left&#xff1a;当前左边界的索引。right&#xff1a;当前右…