牛客网 最短路 Floyd算法 Dijkstra算法 Java大数
生活随笔
收集整理的這篇文章主要介紹了
牛客网 最短路 Floyd算法 Dijkstra算法 Java大数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?鏈接:https://www.nowcoder.com/questionTerminal/a29d0b5eb46b4b90bfa22aa98cf5ff17
來源:牛客網(wǎng)
最短路徑
- 熱度指數(shù):2992 時(shí)間限制:1秒 空間限制:65536K
- 算法知識(shí)視頻講解
N個(gè)城市,標(biāo)號(hào)從0到N-1,M條道路,第K條道路(K從0開始)的長(zhǎng)度為2^K,求編號(hào)為0的城市到其他城市的最短距離
輸入描述:
第一行兩個(gè)正整數(shù)N(2<=N<=100)M(M<=500),表示有N個(gè)城市,M條道路 接下來M行兩個(gè)整數(shù),表示相連的兩個(gè)城市的編號(hào)?
輸出描述:
N-1行,表示0號(hào)城市到其他城市的最短路,如果無法到達(dá),輸出-1,數(shù)值太大的以MOD 100000 的結(jié)果輸出。示例1
輸入
4 4 1 2 2 3 1 3 0 1輸出
8 9 11Floyd算法?
import java.util.*; import java.math.*; public class Main{static int maxn=(int)(100+10);static BigInteger MOD =new BigInteger("100000");static String INF="";static BigInteger[][] map=new BigInteger[maxn][maxn];static int n,m;static BigInteger base=new BigInteger("2");static void init() {for(int i=0;i<=n;i++) {for(int j=0;j<=n;j++) {if(i!=j)map[i][j]=new BigInteger(INF);elsemap[i][j]=new BigInteger("0");}}}static void floyd() {for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(map[i][j].compareTo(map[i][k].add(map[k][j]))>0)map[i][j]=map[i][k].add(map[k][j]);}public static void main(String[] args) {Scanner cin=new Scanner(System.in);for(int i=0;i<=160;i++)//2^500=10^155;INF+="9";while(cin.hasNext()) {n=cin.nextInt();m=cin.nextInt();init(); for(int k=0;k<m;k++) {int u=cin.nextInt();int v=cin.nextInt();if(!map[u][v].toString().equals(INF)) continue;map[u][v]=map[v][u]=new BigInteger( base.pow(k).toString());}floyd();for(int i=1;i<n;i++) {BigInteger d=map[0][i];if(d.toString().equals(INF))System.out.println("-1");elseSystem.out.println(d.mod(MOD));}}cin.close();} }Dijkstra算法
import java.util.*; import java.math.*; public class Main{static int maxn=(int)(100+10);static int n,m;static BigInteger MOD =new BigInteger("100000");static String INF="";static BigInteger[][] map=new BigInteger[maxn][maxn];static BigInteger base=new BigInteger("2");static void init() {for(int i=0;i<=n;i++) {for(int j=0;j<=n;j++) {if(i!=j)map[i][j]=new BigInteger(INF);elsemap[i][j]=new BigInteger("0");}}}static BigInteger[] dis=new BigInteger[maxn];static boolean[] vis =new boolean[maxn];static void dijkstra(int start) {for(int i=0;i<n;i++) {dis[i]=map[start][i];vis[i]=false;}dis[start]=new BigInteger("0");vis[start]=true;for(int i=0;i<n-1;i++) {int k=-1;BigInteger minD=new BigInteger(INF);for(int j=0;j<n;j++) {if(!vis[j]&&dis[j].compareTo(minD)<0) {minD=dis[j];k=j;}}if(k==-1) break;vis[k]=true;for(int j=0;j<n;j++) {if(!vis[j]&&dis[j].compareTo(dis[k].add(map[k][j]))>0)dis[j]=dis[k].add(map[k][j]);}}}public static void main(String[] args) {Scanner cin=new Scanner(System.in);for(int i=0;i<=160;i++)INF+="9";while(cin.hasNext()) {n=cin.nextInt();m=cin.nextInt();init(); for(int k=0;k<m;k++) {int u=cin.nextInt();int v=cin.nextInt();if(!map[u][v].toString().equals(INF)) continue;map[u][v]=map[v][u]=new BigInteger( base.pow(k).toString());}dijkstra(0);for(int i=1;i<n;i++) {BigInteger d=dis[i];if(d.toString().equals(INF))System.out.println("-1");elseSystem.out.println(d.mod(MOD));}}cin.close();} }?
總結(jié)
以上是生活随笔為你收集整理的牛客网 最短路 Floyd算法 Dijkstra算法 Java大数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网 回环矩阵
- 下一篇: Java 图形用户界面(GUI)java