1. 程式人生 > >牛客網 最短路 Floyd演算法 Dijkstra演算法 Java大數

牛客網 最短路 Floyd演算法 Dijkstra演算法 Java大數

 連結:https://www.nowcoder.com/questionTerminal/a29d0b5eb46b4b90bfa22aa98cf5ff17
來源:牛客網

最短路徑

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();
	}
}