目录

1 问题描述

2 解决方案

2.1 floyd算法解决

2.2 spfa算法解决

 


1 问题描述

问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2
数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。


2 解决方案

2.1 floyd算法解决

使用floyd算法(ps:算法笔记_069:Floyd算法简单介绍(Java))求解本题的时间复杂度为O(n^3),下面代码在系统中测评分为40,原因:运行超时。以下代码仅供参考。

具体代码如下:

import java.util.Scanner;

public class Main {

    public void floyd(long[][] adjMatrix) {
for(int k = 0;k < adjMatrix.length;k++) {
for(int i = 0;i < adjMatrix.length;i++) {
for(int j = 0;j < adjMatrix.length;j++) {
if(adjMatrix[i][k] != Integer.MAX_VALUE && adjMatrix[k][j] != Integer.MAX_VALUE) {
if(adjMatrix[i][j] > adjMatrix[i][k] + adjMatrix[k][j])
adjMatrix[i][j] = adjMatrix[i][k] + adjMatrix[k][j];
}
}
}
}
for(int i = 1;i < adjMatrix.length;i++)
System.out.println(adjMatrix[0][i]);
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
if(n > 20000 || n < 1 || m > 200000 || m < 1)
return;
long[][] adjMatrix = new long[n][n];
for(int i = 0;i < n;i++) {
for(int j = 0;j < n;j++)
adjMatrix[i][j] = Integer.MAX_VALUE;
}
for(int i = 0;i < m;i++) {
int a = in.nextInt();
int b = in.nextInt();
int value = in.nextInt();
if(value > 10000 || value < -10000)
return;
adjMatrix[a - 1][b - 1] = value;
}
test.floyd(adjMatrix);
} }

2.2 spfa算法解决

使用spfa算法(PS:算法笔记_071:SPFA算法简单介绍(Java))求解本题的时间复杂度为O(m*E)(PS:其中E为给定边的数目,m为图中顶点进出链表的总次数,一般不大于2*n,n为图中总顶点数)。下面的给出的代码,在系统中测评分为70或者80分(PS:同样代码提交了两次,评分不一样),具体原因:运行超时。可能是Java语言编译时间没有C/C++那么快,所以不能在1s内完成。如果是楼主自己代码问题,还请路过同学不吝赐教啊~

具体代码如下:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner; public class Main { static class edge {
public int a; //边的起点
public int b; //边的终点
public int value; //边的权值 edge(int a, int b, int value) {
this.a = a;
this.b = b;
this.value = value;
}
} public void spfa(ArrayList<edge>[] listA, int n) {
long[] result = new long[n];
int[] num = new int[n];
boolean[] used = new boolean[n];
for(int i = 1;i < n;i++) {
result[i] = Integer.MAX_VALUE;
used[i] = false;
}
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(0);
num[0] = 1;
used[0] = true;
while(list.size() > 0) {
int start = list.getFirst();
for(int i = 0, length = listA[start].size();i < length;i++) {
int b = listA[start].get(i).b;
int value = listA[start].get(i).value;
if(result[b - 1] > result[start] + value) {
result[b - 1] = result[start] + value;
if(!used[b - 1]) {
used[b - 1] = true;
list.add(b - 1);
num[b - 1]++;
if(num[b - 1] > n)
return;
}
}
}
list.removeFirst();
used[start] = false;
}
for(int i = 1;i < n;i++)
System.out.println(result[i]);
return;
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
if(n > 20000 || n < 1 || m > 200000 || m < 1)
return;
@SuppressWarnings("unchecked")
ArrayList<edge>[] listA = new ArrayList[n];
for(int i = 0;i < n;i++)
listA[i] = new ArrayList<edge>();
for(int i = 0;i < m;i++) {
int a = in.nextInt();
int b = in.nextInt();
int value = in.nextInt();
if(value > 10000 || value < -10000)
return;
listA[a - 1].add(new edge(a, b, value));
}
test.spfa(listA, n);
}
}

算法笔记_075:蓝桥杯练习 最短路(Java)的更多相关文章

  1. 算法笔记_052:蓝桥杯练习Multithreading(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 现有如下一个算法: repeat ni times yi := y y := yi+1 end repeat 令n[1]为你需要算加法的第 ...

  2. 算法笔记_083:蓝桥杯练习 合并石子(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数.求把所有石子 ...

  3. 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...

  4. 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大.并且要求你选定的数对的ai之和非负,bi之和非负 ...

  5. 算法笔记_091:蓝桥杯练习 递推求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n- ...

  6. 算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)

    目录 1 问题描述 2 解决方案 2.1 递归法 2.2 递推法   1 问题描述 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰 ...

  7. 算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好 ...

  8. 算法笔记_076:蓝桥杯练习 结点选择(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 有一棵 n 个节点的树,树上每个节点都有一个正整数权值.如果一个点被选择了,那么在树上和它相邻的点都不能被选择.求选出的点的权值和最大是多 ...

  9. 算法笔记_060:蓝桥杯练习 出现次数最多的整数(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统 ...

随机推荐

  1. 2017 Hackatari Codeathon B. 2Trees(深搜)(想法)

    B. 2Trees time limit per test 0.75 seconds memory limit per test 256 megabytes input standard input ...

  2. 【BZOJ 1027】 (凸包+floyd求最小环)

    [题意] 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...

  3. VB查询数据库之组合查询——机房收费总结(二)

    在机房收费系统中,组合查询用的还是挺多的,像上机状态查询窗体.学生上机统计信息窗体.操作员工记录窗体.基本信息维护窗体.这其中,学生基本信息维护窗体中的东西比较多,就以它为例子,说说组合查询吧! 学生 ...

  4. 【Vijos 1607】【NOI 2009】植物大战僵尸

    https://vijos.org/p/1607 vijos界面好漂亮O(∩_∩)O~~ 对于一个植物x,和一个它保护的植物y,连一条边<x,y>表示x保护y,对于每个植物再向它左方的植物 ...

  5. JZYZOJ1384 种花小游戏 状压dp

    http://172.20.6.3/Problem_Show.asp?id=1384  最开始以为是dfs然后超时了,然后调了半天调成dp,还不如再写一遍... 代码 #include<iost ...

  6. 【DFS】【贪心】Codeforces Round #411 (Div. 1) C. Ice cream coloring

    对那个树进行dfs,在动态维护那个当前的冰激凌集合的时候,显然某种冰激凌仅会进出集合各一次(因为在树上形成连通块). 于是显然可以对当前的冰激凌集合贪心染色.暴力去维护即可.具体实现看代码.map不必 ...

  7. JDK源码学习笔记——Integer

    一.类定义 public final class Integer extends Number implements Comparable<Integer> 二.属性 private fi ...

  8. Java编程思想学习(二)----一切都是对象

    2.1用应用操作对象 String s; 这里所创建的只是引用,并不是对象.如果此时向s发送一个消息,就会返回一个运行时错误.这是因为此时s没有和任何事物关联.因此,一种安全的做法是:创建一个引用的同 ...

  9. 迁移11g Rac中OCR和VOTEDISK

    环境:OEL+oracle rac 11.2.0.3 迁移描述:将ocr和votedisk从+DATE上迁移到+OCR_VOTE上: 操作如下: [root@ora2 ~]$ /u01/app/11. ...

  10. 【spring boot】spring boot @ConditionalOnxxx相关注解总结

    参考地址:https://blog.csdn.net/win7system/article/details/54377471 使用场景:在自动解析封装配置文件中的配置完成自动注入spring的时候 例 ...