一、最小生成树
1、Prim算法
适用范围:稠密图
package 最小生成树;
import java.util.Arrays;
import java.util.Scanner;
public class Prim算法 {
static int N = 10010;
static int g[][] = new int [N][N];
static int dist[] = new int [N];
static boolean st[] = new boolean [N];
static int INF = Integer.MAX_VALUE;
static int n,m;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int [] f = new int[N];
Arrays.fill(dist,INF);
Arrays.fill(f,INF);
Arrays.fill(g,f);
System.out.print(INF);
n = in.nextInt();
m = in.nextInt();
for(int i = 1;i <= m;i++) {
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
g[a][b] = Math.min(g[a][b],c);
g[b][c] = Math.min(g[b][c],c);
}
}
static int prim() {
int res = 0;
for(int i = 0;i < n;i++) {
int t = -1;
for(int j = 1;j <= n;j++)
if(!st[i]&&(t == -1||dist[i]<dist[t])) t = i;
if(i !=0 && dist[t] == INF) return INF;
if(i!=0) res += dist[t];
st[t] = true;
for(int j = 1;j <= n;j++) dist[j] = Math.min(dist[j], g[t][j]);
}
return res;
}
}
2、Kruskal算法
适用范围:稀疏图
算法实现:对边权升序(TreeSet)再进行并查集
package 最小生成树;
import java.util.*;
public class Kruskal {
static int N = 10010;
static TreeSet<edge> es = new TreeSet<>();
static int F[] = new int[N];
static int n,m,INF = 0x3f3f3f;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
for(int i=1;i<=n;i++)
F[i] = i;
while(m--!=0) {
int a = in.nextInt();
int b = in.nextInt();
int c = in.nextInt();
es.add(new edge(a,b,c));
}
System.out.print(Kruskal());
}
static int Kruskal() {
int cnt = 0,res = 0;
for(edge e:es) {
int a = e.x;
int b = e.y;
int w = e.v;
if(find(a)!=find(b)) {
cnt++;
F[a] = b;
res+=w;
}
}
if(cnt!=n-1)
return INF;
return res;
}
static class edge implements Comparable<edge>{
int x;
int y;
int v;
public edge(int x, int y, int v) {
this.x = x;
this.y = y;
this.v = v;
}
public int getV() {
return this.v;
}
@Override
public int compareTo(edge o) {
return this.getV() - o.getV();
}
}
static public int find(int x) {
return F[x] = F[x]==x ? F[x] : find(F[x]);
}
}
二、二分图
1、染色法判断二分图
性质:一个图是二分图当且仅当图中不存在奇数环