Dijkstra:
package path;
import java.util.PriorityQueue;
import java.util.Scanner;
public class DijkstraPath {
static class DataNode implements Comparable<DataNode>{
int v;
int distance;
DataNode(int v,int distance){
this.v=v;
this.distance=distance;
}
@Override
public int compareTo(DataNode o) {
return this.distance-o.distance;
}
}
private static int [][] matrix;
private static DataNode [] distance;
private static PriorityQueue<DataNode> priority=new PriorityQueue<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
matrix=new int[n+1][n+1];
for (int i=0;i<m;i++){
int a=in.nextInt();
int b=in.nextInt();
int c=in.nextInt();
matrix[a][b]=matrix[b][a]=c;
}
distance=new DataNode[n+1];
distance[1]=new DataNode(1,0);
priority.add(distance[1]);
for (int i=2;i<=n;i++){
distance[i]=new DataNode(i,Integer.MAX_VALUE);
priority.add(distance[i]);
}
while (!priority.isEmpty()){
DataNode cur=priority.poll();
int curV=cur.v;
int curDistance=cur.distance;
for (int j=1;j<=n;j++){
if (matrix[curV][j]!=0){
if (distance[j].distance>curDistance+matrix[curV][j]){
priority.remove(distance[j]);
distance[j].distance=curDistance+matrix[curV][j];
priority.add(distance[j]);
}
matrix[j][curV]=0;
}
}
}
for (int i=1;i<=n;i++){
System.out.println(distance[i].distance);
}
}
}
Dijkstra2:
package path;
import java.util.PriorityQueue;
import java.util.Scanner;
public class DijkstraPath_Instance01 {
static class DataNode implements Comparable<DataNode>{
int v;
int distance;
DataNode(int v,int distance){
this.v=v;
this.distance=distance;
}
@Override
public int compareTo(DataNode o) {
return this.distance-o.distance;
}
}
private static int [][] matrix;
private static DataNode [] distance;
private static PriorityQueue<DataNode> priority=new PriorityQueue<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
matrix=new int[n+1][n+1];
for (int i=0;i<m;i++){
int a=in.nextInt();
int b=in.nextInt();
int c=in.nextInt();
matrix[a][b]=matrix[b][a]=c;
}
distance=new DataNode[n+1];
distance[1]=new DataNode(1,0);
priority.add(distance[1]);
for (int i=2;i<=n;i++){
distance[i]=new DataNode(i,Integer.MAX_VALUE);
priority.add(distance[i]);
}
while (!priority.isEmpty()){
DataNode cur=priority.poll();
int curV=cur.v;
int curDistance=cur.distance;
if (curV==n){
break;
}
for (int j=1;j<=n;j++){
if (matrix[curV][j]!=0){
if (distance[j].distance>curDistance+matrix[curV][j]){
priority.remove(distance[j]);
distance[j].distance=curDistance+matrix[curV][j];
priority.add(distance[j]);
}
matrix[j][curV]=0;
}
}
}
System.out.println(distance[n].distance);
}
}
Floyd
package path;
import java.util.Scanner;
public class Floyd {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
int [][] matrix=new int[n+1][n+1];
init(matrix);
for (int i=0;i<m;i++){
int a=in.nextInt();
int b=in.nextInt();
int c=in.nextInt();
matrix[a][b]=matrix[b][a]=c;
}
for (int k=1;k<=n;k++){
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (matrix[i][k]+matrix[k][j]<matrix[i][j]){
matrix[i][j]=matrix[i][k]+matrix[k][j];
}
}
}
}
System.out.println(matrix[1][n]);
}
private static void init(int [][] a){
for (int i=0;i<a.length;i++){
for (int j=0;j<a.length;j++){
if (i!=j){
a[i][j]=Integer.MAX_VALUE;
}
}
}
}
}
Kruskal
package path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Kruskal_instance01 {
static class Node implements Comparable<Node>{
int v1;
int v2;
double e;
Node(int v1,int v2,double e){
this.v1=v1;
this.v2=v2;
this.e=e;
}
@Override
public int compareTo(Node o) {
return this.e<o.e?-1:1;
}
}
private static int [] fa;
private static int getFather(int x){
if (fa[x]==x){return x;}
return fa[x]=getFather(fa[x]);
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
fa=new int[n];
for (int i=0;i<n;i++){
fa[i]=i;
}
int [][] vs=new int[n][2];
for (int i=0;i<n;i++){
vs[i][0]=in.nextInt();
vs[i][1]=in.nextInt();
}
List<Node> list=new ArrayList<>();
for (int i=0;i<n-1;i++){
for (int j=i+1;j<n;j++){
double e=Math.sqrt((vs[j][0]-vs[i][0])*(vs[j][0]-vs[i][0])+(vs[j][1]-vs[i][1])*(vs[j][1]-vs[i][1]));
list.add(new Node(i,j,e));
}
}
Collections.sort(list);
int cnt=n-1;
double res=0.0;
for (int i=0;i<list.size()&&cnt>0;i++){
Node edge=list.get(i);
int fv1=getFather(edge.v1);
int fv2=getFather(edge.v2);
if (fv1!=fv2){
cnt--;
res+=edge.e;
fa[fv1]=fv2;
}
}
System.out.printf("%.2f",res);
}
}
Kruskal2
package path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class Kruskal_Instance02 {
private static int [] fa;
static class Node implements Comparable<Node>{
int v1;
int v2;
int e;
Node(int v1,int v2,int e){
this.v1=v1;
this.v2=v2;
this.e=e;
}
@Override
public int compareTo(Node o) {
return this.e-o.e;
}
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
fa=new int[n+1];
List<Node> list=new ArrayList<>();
for (int i=0;i<m;i++){
int a=in.nextInt();
int b=in.nextInt();
int c=in.nextInt();
list.add(new Node(a,b,c));
}
Collections.sort(list);
int res=Integer.MAX_VALUE;
for (int i=0;i<=m-1-(n-1)+1;i++){
res=Math.min(res,getMinTreeFromIndex(i,list));
}
if (res==Integer.MAX_VALUE){
System.out.println(-1);
}else{
System.out.println(res);
}
}
private static int getMinTreeFromIndex(int index,List<Node> list){
int n=fa.length-1;
for (int i=1;i<=n;i++){
fa[i]=i;
}
int cnt=n-1;
int min=Integer.MAX_VALUE;
int max=Integer.MIN_VALUE;
for (int i=index;i<list.size()&&cnt>0;i++){
Node edge=list.get(i);
int fv1=getFather(edge.v1);
int fv2=getFather(edge.v2);
if (fv1!=fv2){
cnt--;
fa[fv1]=fv2;
if (edge.e<min){
min=edge.e;
}
if (edge.e>max){
max=edge.e;
}
}
}
if (cnt>0){
return Integer.MAX_VALUE;
}
return max-min;
}
private static int getFather(int x){
if (fa[x]==x){return x;}
return fa[x]=getFather(fa[x]);
}
}
MinTree_Kruskal
package path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class MinTree_Kruskal {
static class Node implements Comparable<Node>{
int v1;
int v2;
int e;
Node(int v1,int v2,int e){
this.v1=v1;
this.v2=v2;
this.e=e;
}
@Override
public int compareTo(Node o) {
return this.e-o.e;
}
}
private static int [] fa;
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int [][] matrix=new int[n][n];
List<Node> list=new ArrayList<>();
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
matrix[i][j]=in.nextInt();
if (j>i){
list.add(new Node(i,j,matrix[i][j]));
}
}
}
fa=new int[n];
for (int i=0;i<n;i++){
fa[i]=i;
}
Collections.sort(list);
int res=0;
int cnt=n;
for (int i=0;i<list.size()&&cnt>1;i++){
Node edge = list.get(i);
int fv1=getFather(edge.v1);
int fv2=getFather(edge.v2);
if (fv1!=fv2){
cnt--;
res += edge.e;
fa[fv1]=fa[fv2];
}
}
System.out.println(res);
}
private static int getFather(int x){
if (x==fa[x]){return x;}
return fa[x]=getFather(fa[x]);
}
}
拓扑排序
package path;
import java.util.*;
public class Sort_Instance01 {
static class Node{
int inNum;
LinkedList<Integer> outEdge;
int money;
Node(int inNum,LinkedList<Integer> outEdge){
this.inNum=inNum;
this.outEdge=outEdge;
}
}
private static HashMap<Integer,Node> links;
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
links=new HashMap<>(n*4/3+1);
for (int i=1;i<=n;i++){
links.put(i,new Node(0,new LinkedList<>()));
}
for (int i=0;i<m;i++){
int a=in.nextInt();
int b=in.nextInt();
links.get(b).outEdge.add(a);
links.get(a).inNum++;
}
Deque<Integer> queue=new ArrayDeque<>();
for (int i=1;i<=n;i++){
Node node=links.get(i);
if (node.inNum==0){
node.money=100;
queue.add(i);
}
}
if (queue.size()==0){
System.out.println("Unhappy!");
return;
}
int res=0;
int count=0;
while (!queue.isEmpty()){
int size=queue.size();
for (int i=0;i<size;i++){
int curV=queue.poll();
Node curNode=links.get(curV);
res+=curNode.money;
count++;
for (Integer nextV : curNode.outEdge){
Node nextNode=links.get(nextV);
nextNode.inNum--;
nextNode.money=curNode.money+1;
if (nextNode.inNum==0){
queue.add(nextV);
}
}
}
}
if (count<n){
System.out.println("Unhappy!");
}else{
System.out.println(res);
}
}
}
SPFA:
package path;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.Scanner;
public class SPFA {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
boolean [] inQueue=new boolean[n+1];
int [] dist=new int[n+1];
int [][] matrix=new int[n+1][n+1];
for (int i=0;i<m;i++){
int a=in.nextInt();
int b=in.nextInt();
int c=in.nextInt();
matrix[a][b]=matrix[b][a]=c;
}
Arrays.fill(dist,Integer.MAX_VALUE);
dist[1]=0;
Deque<Integer> queue=new ArrayDeque<>();
queue.add(1);
inQueue[1]=true;
while (!queue.isEmpty()){
int size=queue.size();
for (int i=0;i<size;i++){
int curV=queue.poll();
inQueue[curV]=false;
for (int j=1;j<=n;j++){
if (matrix[curV][j]!=0){
if (dist[curV]+matrix[curV][j]<dist[j]){
dist[j]=dist[curV]+matrix[curV][j];
if (!inQueue[j]){
if (!queue.isEmpty()&&dist[j]<dist[queue.peekFirst()]){
queue.addFirst(j);
}else{
queue.add(j);
}
}
}
}
}
}
}
System.out.println(dist[n]);
}
}