这周的作业不需要自己写算法,只需要调用库函数就行,但是有些难以理解,因此用了不少时间。

 import edu.princeton.cs.algs4.FlowEdge;
import edu.princeton.cs.algs4.FlowNetwork;
import edu.princeton.cs.algs4.FordFulkerson;
import edu.princeton.cs.algs4.ST;
import edu.princeton.cs.algs4.Queue;
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut; public class BaseballElimination
{
private int numberOfTeams;
private ST<String, Integer> st;
private int[] wins;
private int[] losses;
private int[] remaining;
private int[][] against;
private String[] teamName; public BaseballElimination(String filename)
{
st = new ST<String, Integer>();
In in = new In(filename);
numberOfTeams = in.readInt();
wins = new int[numberOfTeams];
losses = new int[numberOfTeams];
remaining = new int[numberOfTeams];
teamName = new String[numberOfTeams];
against = new int[numberOfTeams][numberOfTeams]; for (int i = 0; i < numberOfTeams; i++)
{
String name = in.readString();
st.put(name, i);
wins[i] = in.readInt();
losses[i] = in.readInt();
remaining[i] = in.readInt();
teamName[i] = name;
for (int j = 0; j < numberOfTeams; j++)
against[i][j] = in.readInt();
}
} public int numberOfTeams()
{
return numberOfTeams;
} public Iterable<String> teams()
{
return st.keys();
} public int wins(String team)
{
if (!st.contains(team)) throw new IllegalArgumentException();
int index = st.get(team);
return wins[index];
} public int losses(String team)
{
if (!st.contains(team)) throw new IllegalArgumentException();
int index = st.get(team);
return losses[index];
} public int remaining(String team)
{
if (!st.contains(team)) throw new IllegalArgumentException();
int index = st.get(team);
return remaining[index];
} public int against(String team1, String team2)
{
if (!st.contains(team1) || !st.contains(team2)) throw new IllegalArgumentException();
int index1 = st.get(team1);
int index2 = st.get(team2);
return against[index1][index2];
} private FlowNetwork createNetwork(String team)
{
int index = st.get(team);
int num = numberOfTeams - 1; int V = num + 2 + num * (num - 1) / 2;
int s = V - 2, t = V - 1;
FlowNetwork net = new FlowNetwork(V); for (int i = 0; i < num; i++)
{
if (i < index)
{
double capacity = wins[index] + remaining[index] - wins[i];
FlowEdge edge = new FlowEdge(i, t, capacity);
net.addEdge(edge);
}
else
{
double capacity = wins[index] + remaining[index] - wins[i + 1];
FlowEdge edge = new FlowEdge(i, t, capacity);
net.addEdge(edge);
}
}
int temp = num;
for (int i = 0; i < num - 1; i++)
{
for (int j = i + 1; j < num; j++)
{
FlowEdge edge = new FlowEdge(temp, j, Double.POSITIVE_INFINITY);
net.addEdge(edge); edge = new FlowEdge(temp, i, Double.POSITIVE_INFINITY);
net.addEdge(edge); int a = i, b = j;
if (i >= index) a++;
if (j >= index) b++;
double capacity = against[a][b];
edge = new FlowEdge(s, temp, capacity);
net.addEdge(edge); temp++;
}
} return net;
} public boolean isEliminated(String team)
{
if (!st.contains(team)) throw new IllegalArgumentException();
int index = st.get(team);
int num = numberOfTeams - 1;
int V = num + 2 + num * (num - 1) / 2;
int s = V - 2, t = V - 1; for (int i = 0; i < num; i++)
{
int j = i;
if (j >= index) j++;
if (wins[index] + remaining[index] < wins[j])
return true;
} FlowNetwork net = createNetwork(team); FordFulkerson ff = new FordFulkerson(net, s, t);
for (FlowEdge e : net.adj(s))
if (e.capacity() != e.flow())
return true; return false;
} public Iterable<String> certificateOfElimination(String team)
{
if (!st.contains(team)) throw new IllegalArgumentException();
int index = st.get(team);
int num = numberOfTeams - 1;
int V = num + 2 + num * (num - 1) / 2;
int s = V - 2, t = V - 1;
Queue<String> certificate = new Queue<String>(); boolean isEliminated = false;
for (int i = 0; i < num; i++)
{
int j = i;
if (j >= index) j++;
if (wins[index] + remaining[index] < wins[j])
{
isEliminated = true;
certificate.enqueue(teamName[j]);
}
}
if (isEliminated) return certificate; FlowNetwork net = createNetwork(team); FordFulkerson ff = new FordFulkerson(net, s, t);
for (int i = 0; i < num; i++)
{
if (ff.inCut(i))
{
int j = i;
if (j >= index) j++;
certificate.enqueue(teamName[j]);
isEliminated = true;
}
} if (isEliminated) return certificate; return null;
} public static void main(String[] args) {
BaseballElimination division = new BaseballElimination(args[0]);
for (String team : division.teams()) {
if (division.isEliminated(team)) {
StdOut.print(team + " is eliminated by the subset R = { ");
for (String t : division.certificateOfElimination(team)) {
StdOut.print(t + " ");
}
StdOut.println("}");
}
else {
StdOut.println(team + " is not eliminated");
}
}
}
}

Coursera 算法二 week 3 Baseball Elimination的更多相关文章

  1. Coursera 算法二 week2 Seam Carving

    这周作业设计到的算法是有向无环图的最短路径算法,只需要按照顶点的拓扑顺序去放松顶点即可.而在这个题目中拓扑顺序就是按照行的顺序或列的顺序. 用到的数据结构为一个二维数组picture同来存储每个像素的 ...

  2. Coursera 算法二 week 5 BurrowsWheeler

    本打算周末完成这次作业,但没想到遇到了hard deadline,刚开始看不懂题意,后来发现算法4书上有个类似的问题,才理解了题意.最后晚上加班,上课加班,还好在11:35也就是课程结束前25分钟完成 ...

  3. Coursera 算法二 week 4 Boggle

    这次的作业主要用到了单词查找树和深度优先搜索. 1.在深度优先搜索中,在当前层的递归调用前,将marked数组标记为true.当递归调用返回到当前层时,应将marked数组标记为false.这样既可以 ...

  4. coursera 算法二 week 1 wordnet

    这周的作业可谓是一波三折,但是收获了不少,熟悉了广度优先搜索还有符号图的建立.此外还知道了Integer.MAX_VALUE. SAP: 求v和w的大概思路是对v和w分别广度优先搜索,然后遍历图中每一 ...

  5. Programming Assignment 3: Baseball Elimination

    编程作业三 作业链接:Baseball Elimination & Checklist 我的代码:BaseballElimination.java 问题简介 这是一个最大流模型的实际应用问题: ...

  6. TensorFlow 入门之手写识别(MNIST) softmax算法 二

    TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  7. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  8. Floyd算法(二)之 C++详解

    本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...

  9. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

随机推荐

  1. Tomcat之NIO 启动与应用分析

    概述 从入门Web开始一直在使用Tomcat,随着对网络相关的知识的进一步了解,觉得越有必有去阅读一下常用的开源服务器的整个工作流程,以及使用场景,对比几款服务器的优劣势.最终根据合适的业务场景进行优 ...

  2. Exception异常处理

    1.java异常类: 都是Throwable的子类: 1.Exception(异常) :是程序本身可以处理的异常. 2.Error(错误): 是程序无法处理的错误.这些错误表示故障发生于虚拟机自身.或 ...

  3. 七层登录——VB.NET版

    敲完三层后,感觉还是对三层架构没有那么亲切,和小伙伴交流后,他们说多多敲几遍,就懂了,其实就是那么几条线,所以:不管会不会,先去做吧! 下面是关于七层的包图: 我的解决方案: 代码部分: U层: &l ...

  4. 问题 Can't load AMD 64-bit .dll on a IA 32-bit platform

    问题简要描述: java.lang.UnsatisfiedLinkError: F:\Tools\tomcat6045\tomcat6.0.45_x64\apache-tomcat-6.0.45\bi ...

  5. 备份与恢复:MySQL系列之十二

    一.备份策略赘述 1.备份的类型 类型1: 热备份:读写不受影响(MyISAM不支持热备,InnoDB支持热备) 温备份:仅可以执行读操作 冷备份:离线备份,读写操作均中止 类型2: 物理备份:复制数 ...

  6. Git练习3 远程库分支 idea中状态条显示当前分支

  7. 74th LeetCode Weekly Contest Valid Tic-Tac-Toe State

    A Tic-Tac-Toe board is given as a string array board. Return True if and only if it is possible to r ...

  8. sleuth使用说明(入门)

    出发点: 微服务架构上通过业务来划分服务的,通过REST调用,对外暴露的一个接口,可能需要很多个服务协同才能完成这个接口功能,如果链路上任何一个服务出现问题或者网络超时,都会形成导致接口调用失败.随着 ...

  9. postman将上一个请求的结果作为下一个请求的数据

    需要在Tests中写入如下代码: var jsonData = JSON.parse(responseBody); postman.setGlobalVariable("token" ...

  10. asp.net mvc里面竟然也可以用eval()

    刚才在项目里面看到了一个牛逼的用法: style="display:<%# Eval("IsSharingPlatformDisplay") %>" ...