当前位置:网站首页>【最短路】ACwing 1127. 香甜的黄油(堆优化的dijsktra或spfa)
【最短路】ACwing 1127. 香甜的黄油(堆优化的dijsktra或spfa)
2022-07-07 09:46:00 【暮色_年华】

抽象问题:
求所有奶牛到某个点的最短距离和的最小值。
由于是双向的,可以看成从某个点到所有其他点的最短距离的最小值。
所以,可以看成是单源最短路问题,由于是稀疏图且没有负边,所以可以使用堆优化的dij或者spfa
import java.io.*;
import java.util.*;
class Main{
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static final int N=10000;
static final int INF=(int)1e8;
static int[]dist=new int[N];
static int[]h=new int[N];
static int[]ne=new int[N];
static int[]e=new int[N];
static int[]w=new int[N];
static int[]nums=new int[N];
static boolean[] st=new boolean[N];
static int idx;
static int n,p,c;
public static void add(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
public static void dijskra(int start){
PriorityQueue<int[]>pq=new PriorityQueue<>(p,(a,b)->a[1]-b[1]);
Arrays.fill(dist,INF);
Arrays.fill(st,false);
dist[start]=0;
pq.add(new int[]{start,0});
while(!pq.isEmpty()){
int[]cur=pq.poll();
int v=cur[0];
int d=cur[1];
if(st[v])continue;
st[v]=true;
for(int i=h[v];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>d+w[i]){
dist[j]=d+w[i];
pq.add(new int[]{j,dist[j]});
}
}
}
}
public static void main(String[] args)throws IOException{
String[] s=br.readLine().split(" ");
n=Integer.parseInt(s[0]);
p=Integer.parseInt(s[1]);
c=Integer.parseInt(s[2]);
for(int i=1;i<=n;i++){
int t=Integer.parseInt(br.readLine());
nums[t]++;
}
Arrays.fill(h,-1);
for(int i=0;i<c;i++){
s=br.readLine().split(" ");
int a=Integer.parseInt(s[0]);
int b=Integer.parseInt(s[1]);
int c=Integer.parseInt(s[2]);
add(a,b,c);
add(b,a,c);
}
int res=INF;
for(int i=1;i<=p;i++){
dijskra(i);
int sum=0;
for(int j=1;j<=p;j++){
sum+=dist[j]*nums[j];
}
res=Math.min(res,sum);
}
System.out.println(res);
}
}spfa:
import java.io.*;
import java.util.*;
class Main{
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static final int N=5000;
static final int INF=(int)1e8;
static int[]h=new int[N];
static int[]ne=new int[N];
static int[]e=new int[N];
static int[]w=new int[N];
static int[]dist=new int[N];
static boolean[]st=new boolean[N];
static int idx;
static int[]nums=new int[N];
static int n,p,c;
public static void add(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
public static void spfa(int start){
Arrays.fill(dist,INF);
dist[start]=0;
Queue<Integer>q=new LinkedList<>();
q.add(start);
st[start]=true;
while(!q.isEmpty()){
int cur=q.poll();
st[cur]=false;
for(int i=h[cur];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>dist[cur]+w[i]){
dist[j]=dist[cur]+w[i];
if(!st[j]){
q.add(j);
st[j]=true;
}
}
}
}
}
public static void main(String[]args)throws IOException{
String[]s=br.readLine().split(" ");
n=Integer.parseInt(s[0]);
p=Integer.parseInt(s[1]);
c=Integer.parseInt(s[2]);
for(int i=1;i<=n;i++){
int t=Integer.parseInt(br.readLine());
nums[t]++;
}
Arrays.fill(h,-1);
for(int i=0;i<c;i++){
s=br.readLine().split(" ");
int a=Integer.parseInt(s[0]);
int b=Integer.parseInt(s[1]);
int w=Integer.parseInt(s[2]);
add(a,b,w);
add(b,a,w);
}
int res=INF;
for(int i=1;i<=p;i++){
spfa(i);
int sum=0;
for(int j=1;j<=p;j++){
sum+=dist[j]*nums[j];
}
res=Math.min(res,sum);
}
System.out.println(res);
}
}边栏推荐
- Activity生命周期
- Poor math students who once dropped out of school won the fields award this year
- Verilog design responder [with source code]
- QT implements the delete method of the container
- 【时间格式工具函数的封装】
- . Net Maui performance improvement
- STM32入门开发 NEC红外线协议解码(超低成本无线传输方案)
- 聊聊SOC启动(十) 内核启动先导知识
- 0.96 inch IIC LCD driver based on stc8g1k08
- vim 的各种用法,很实用哦,都是本人是在工作中学习和总结的
猜你喜欢

通过 Play Integrity API 的 nonce 字段提高应用安全性

聊聊SOC启动(十一) 内核初始化

Suggestions on one-stop development of testing life

分布式数据库主从配置(MySQL)

请查收.NET MAUI 的最新学习资源

测试开发基础,教你做一个完整功能的Web平台之环境准备

What is cloud computing?
![Drive HC based on de2115 development board_ SR04 ultrasonic ranging module [source code attached]](/img/ed/29d6bf21f857ec925bf425ad594e36.png)
Drive HC based on de2115 development board_ SR04 ultrasonic ranging module [source code attached]

Talk about SOC startup (x) kernel startup pilot knowledge

相机标定(2): 单目相机标定总结
随机推荐
Drive HC based on de2115 development board_ SR04 ultrasonic ranging module [source code attached]
使用引用
Electron adding SQLite database
STM32 entry development NEC infrared protocol decoding (ultra low cost wireless transmission scheme)
Suggestions on one-stop development of testing life
测试开发基础,教你做一个完整功能的Web平台之环境准备
正在運行的Kubernetes集群想要調整Pod的網段地址
Activity lifecycle
sql里,我想设置外键,为什么出现这个问题
What is cloud computing?
【愚公系列】2022年7月 Go教学课程 005-变量
本地navicat连接liunx下的oracle报权限不足
请查收.NET MAUI 的最新学习资源
Using ENSP to do MPLS pseudo wire test
How to remove addition and subtraction from inputnumber input box
Poor math students who once dropped out of school won the fields award this year
Use references
自动化测试框架
There are so many factors that imprison you
The database synchronization tool dbsync adds support for mongodb and es