牛客網 最短路 Floyd演算法 Dijkstra演算法 Java大數
阿新 • • 發佈:2018-11-10
連結:https://www.nowcoder.com/questionTerminal/a29d0b5eb46b4b90bfa22aa98cf5ff17
來源:牛客網
最短路徑
- 熱度指數:2992 時間限制:1秒 空間限制:65536K
- 演算法知識視訊講解
N個城市,標號從0到N-1,M條道路,第K條道路(K從0開始)的長度為2^K,求編號為0的城市到其他城市的最短距離
輸入描述:
第一行兩個正整數N(2<=N<=100)M(M<=500),表示有N個城市,M條道路
接下來M行兩個整數,表示相連的兩個城市的編號
輸出描述:
N-1行,表示0號城市到其他城市的最短路,如果無法到達,輸出-1,數值太大的以MOD 100000 的結果輸出。
示例1
輸入
4 4
1 2
2 3
1 3
0 1
輸出
8
9
11
Floyd演算法
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); else map[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"); else System.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); else map[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"); else System.out.println(d.mod(MOD)); } } cin.close(); } }