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