图论算法 海上开采站
来源:互联网 发布:淘宝钻展在哪里 编辑:程序博客网 时间:2024/04/28 23:41
package com.bluecup.org;import java.util.Arrays;import java.util.Scanner;public class KM_Min {/** * @param args */static int n, m, k, p;static int a[] = new int[20];static int b[] = new int[20];static int map1[][] = new int[20][20];static int map2[][] = new int[20][20];static int f[][] = new int[20][20];static int lx[] = new int[20];static int ly[] = new int[20];static boolean edge[][] = new boolean[20][20];static boolean xmatch[] = new boolean[10];static boolean ymatch[] = new boolean[10];static int match[] = new int[10];public static void main(String[] args) {// TODO Auto-generated method stubScanner scan = new Scanner(System.in);n = scan.nextInt();m = scan.nextInt();k = scan.nextInt();p = scan.nextInt();for (int i = 1; i <= n; i++) {a[i] = scan.nextInt();b[i] = i + 1;}for (int i = 1; i <= m; i++) {Arrays.fill(map1[i], 1000);Arrays.fill(f[i], 1000);Arrays.fill(map2[i], 1000);}for (int i = 0; i < k; i++) {int a, b;a = scan.nextInt();b = scan.nextInt();map1[a][b] = map1[b][a] = scan.nextInt();}for (int i = 0; i < p; i++) {int a, b;a = scan.nextInt();b = scan.nextInt();map2[a][b] = f[a][b] = scan.nextInt();}for (int i = 1; i <= m; i++) {for (int j = 1; j <= m; j++)for (int k = 1; k <= m; k++) {if (i != j && i != k && j != k)if (map1[j][k] > map1[j][i] + map1[i][k])map1[j][k] = map1[j][i] + map1[i][k];}}for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++)for (int k = 1; k <= m; k++) {if (f[j][k] > map2[j][i] + map1[i][k])f[j][k] = map2[j][i] + map1[i][k];}}for (int i = 1; i <= n; i++) {lx[i] = Integer.MAX_VALUE;for (int j = 1; j <= n; j++)if (f[i][a[j]] < lx[i])lx[i] = f[i][a[j]];}while (true) {for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++)if (f[i][a[j]] == lx[i] + ly[j])edge[i][j] = true;elseedge[i][j] = false;}for (int i = 1; i <= n; i++)match[i] = -1;int value = 0;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {xmatch[j] = false;ymatch[j] = false;}if (hungary(i)) {value++;} else {xmatch[i] = true;break;}}if (value >= n)break;int ex;ex = Integer.MAX_VALUE;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n && xmatch[i]; j++) {if (!ymatch[j] && ex > (lx[i] + ly[j] - f[i][a[j]])) {ex = lx[i] + ly[j] - f[i][a[j]];}}}for (int i = 1; i <= n; i++) {if (xmatch[i]) {lx[i] = lx[i] - ex;}if (ymatch[i]) {ly[i] = ly[i] + ex;}}}int cost = 0;for (int i = 1; i <= n; i++) {System.out.println(a[match[i]]);cost += f[i][a[match[i]]];}System.out.println(cost + "最小值");}private static boolean hungary(int x) {// TODO Auto-generated method stubfor (int i = 1; i <= n; i++) {if (!ymatch[i] && edge[x][i]) {ymatch[i] = true;if (match[i] == -1 || hungary(match[i])) {match[i] = x;return true;}if (match[i] != -1)xmatch[match[i]] = true;}}return false;}}
0 0
- 图论算法 海上开采站
- 论电影《海上钢琴师》的象征艺术
- 《海上钢琴师》
- 海上名山
- 海上钢琴师
- 海上钢琴师
- 海上钢琴师
- 海上钢琴师
- 海上逃亡
- 开采家里的黄金
- 中国页岩气,开采不容易
- 你有“金矿”,开采吧
- 树莓派开采莱特币(Litecoin)
- HDU 2448 Mining Station on the Sea 海上的矿站(费用流)
- 广东阳江发现5000多只野生动物被弃海上(图)
- 海上花 思过崖
- 我看《海上花》
- 南海海上观音
- Intellij 安装时报需要jdk1.6.0
- 受关注的两个投资市场就是港股和美股
- cocos2d-x图片内存
- Jasperreport API实现交叉表(Cross table)配置
- C语言实现结构体继承
- 图论算法 海上开采站
- 矩阵知识
- 在GitHub上管理项目
- C语言全局变量定义-2014/5/5
- 手势识别器
- Python 基础 —— 循环技术
- Chrome下, iframe中PageUp时导致父/祖先元素显示错位
- ASP.NET MVC Notes1
- 【Cococs2d-x】Cocos2d-x之图片编辑器TexturePacker