int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int Lcm(int a,int b){
return a*gcd(a,b)/b;
}
- Dijkstra求最短路径
每次找离出发点距离最近的点,维护其邻居距离出发点的最短路径
//根据结点数量改变
final int N = 10001;
final int INF = Integer.MAX_VALUE;
//初始化图
int[][] g = new int[N][N];
//记录到出发点的最短路径,初始化为INF
int[] minDist = new int[N];
//记录已处理结点
boolean[] vis = new boolean[N];
Arrays.fill(minDist,INF);
//优先队列维护最短路径
PriorityQueue<int[]> pq = new PriorityQueue<>((a,b)->(a[1]-b[1]));
pq.add(new int[]{0,0});
while(!pq.isEmpty()){
int[] x = pq.poll();
//分别代表下标与距离
int i = x[0];
int dis = x[1];
//找邻居
for(int j = 0;j < N;j++){
int d = g[i][j];
if(dis+d<minDist[j]&&!vis[j]){
pq.add(new int[]{j,dis+d});
minDist[j] = dis+d;
}
}
vis[i] = true;
}