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

 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. Algorithms - Fibonacci Number

    斐波那契数列(Fibonacci Number)从数学的角度是以递归的方法定义的: \(F_0 = 0\) \(F_1 = 1\) \(F_n = F_{n-1} + F_{n-2}\) (\(n \ ...

  2. SpringBoot应用篇(一):自定义starter

    一.码前必备知识 1.SpringBoot starter机制 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在mave ...

  3. C4-总结

    呃,很难受的比赛,中途做到口干舌燥还想尿尿//哦,题目,出的很棒,什么都可以做做,什么都做不下来. 怎么说呢?好像也没犯什么错误,除了日常开始手抖了一下...后面状态进入挺快的,而且遗憾?3-2吧,t ...

  4. PAT 1071【STL string应用】

    1.单case很多清空没必要的 2.string+ char 最好用pushback 3.string +string就直接+ #include <bits/stdc++.h> using ...

  5. 洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)

    传送门 大佬讲的真吼->这里 首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数 那么答案就是$\sum_{i=0}^{m-1}f[n][i]$ 然后考 ...

  6. À peu près là 隐私政策

    隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...

  7. PAT甲级——1097 Deduplication on a Linked List (链表)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/91157982 1097 Deduplication on a L ...

  8. kvm磁盘io优化以及性能测试以及与物理机对比

    ubuntu下kvm的磁盘io性能优化步骤 1.virsh shutdown wcltest2 2.virsh edit wcltest2 <driver name='qemu' type='q ...

  9. vue——解决“You may use special comments to disable some warnings. Use // eslint-disable-next-line to ignore the next line. Use /* eslint-disable */ to ignore all warnings in a file. ”

    在build/webpack.base.conf.js文件中,注释或者删除掉:module->rules中有关eslint的规则 module: { rules: [ //...(config. ...

  10. Gym - 100221D 一题一直没过的dfs,,应该是纯手动码?

    不写了,10年以后再回来写. http://codeforces.com/gym/100221/attachments H题