当前位置:网站首页>【最短路】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);
}
}边栏推荐
- The annual salary of general test is 15W, and the annual salary of test and development is 30w+. What is the difference between the two?
- Easyui学习整理笔记
- 深度学习秋招面试题集锦(一)
- Network protocol concept
- Automated testing framework
- 分布式数据库主从配置(MySQL)
- Qt|多个窗口共有一个提示框类
- How to use cherry pick?
- Reasons for the failure of web side automation test
- 對比學習之 Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
猜你喜欢

Excel公式知多少?

正在運行的Kubernetes集群想要調整Pod的網段地址

Unsupervised learning of visual features by contracting cluster assignments

在我有限的软件测试经历里,一段专职的自动化测试经验总结

聊聊SOC启动(七) uboot启动流程三

Socket socket programming

What is cloud computing?

The annual salary of general test is 15W, and the annual salary of test and development is 30w+. What is the difference between the two?

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

The opacity value becomes 1%
随机推荐
What is cloud computing?
如何在博客中添加Aplayer音乐播放器
通过环境变量将 Pod 信息呈现给容器
Vuthink正确安装过程
对比学习之 Unsupervised Learning of Visual Features by Contrasting Cluster Assignments
Using ENSP to do MPLS pseudo wire test
[question] Compilation Principle
Neural approvals to conversational AI (1)
聊聊SOC启动(六)uboot启动流程二
. Net Maui performance improvement
Array object sorting
【时间格式工具函数的封装】
electron 添加 SQLite 数据库
CentOS系统下Redis安装和自启动配置的步骤
一度辍学的数学差生,获得今年菲尔兹奖
Case study of Jinshan API translation function based on retrofit framework
常用sql语句整理:mysql
科普达人丨一文弄懂什么是云计算?
Enclosed please find. Net Maui's latest learning resources
解决VSCode只能开两个标签页的问题