图论基础算法

一、最小生成树

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、染色法判断二分图

性质:一个图是二分图当且仅当图中不存在奇数环

2、匈牙利算法求最大匹配数

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值