Skip to content

Commit 8c704e3

Browse files
committed
initial commit
Flow
1 parent c3909c6 commit 8c704e3

File tree

8 files changed

+489
-0
lines changed

8 files changed

+489
-0
lines changed

Flow/cricket.html

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<html lang="en">
2+
<head>
3+
<title>Cricket elimination</title>
4+
<style>
5+
table tr:nth-child(even) {
6+
background-color: #eee;
7+
}
8+
table tr:nth-child(odd) {
9+
background-color: #fff;
10+
}
11+
th {
12+
color: white;
13+
background-color: black;
14+
}
15+
tr{
16+
color:black;
17+
height: 3vh;
18+
}
19+
button{
20+
border-radius: 20px;
21+
border-color:#00FFFF;
22+
background-color: #CCFFFF;
23+
font-size:2vh;
24+
}
25+
label {
26+
width: 90%;
27+
padding: 6px 0 6px 0;
28+
}
29+
input{
30+
width:100%;
31+
}
32+
body{
33+
text-align:center;
34+
}
35+
#canvas{
36+
margin-left: 35%;
37+
width:30%;
38+
height:30%;
39+
}
40+
span {
41+
color:#FF7777;
42+
}
43+
</style>
44+
</head>
45+
46+
<body>
47+
<h1>Base-ball elimination</h1>
48+
Simple calculator which solves the Baseball elimination problem online.
49+
It basically finds <span> Which teams have a chance of finishing the season with the most wins? </span> <br>
50+
This calculator uses DINIC Max Flow algorithm for the same. Run time of Dinic's: <span> O(EV^2) </span>, Runtime of this calculator: <span> O(TxV^3) = O(T^7)</span>
51+
<br>
52+
<br>
53+
<br>
54+
55+
<input id="addteam" style="width:20%"></input>
56+
<button id="add" for="addteam">Add Team</button>
57+
<br>
58+
<br>
59+
<br>
60+
<br>
61+
<table style="width:80%;margin-left:10%;" id="table">
62+
<tr>
63+
<th rowspan="2" width="30%">Team</th><th rowspan="2" width="10%">Wins</th><th rowspan="2" width="10%">Losses</th><th id="remaining" colspan="1" width="50%">Remaining</th>
64+
</tr>
65+
<tr id="teams"></tr>
66+
</table>
67+
<br>
68+
<br>
69+
<button id="run">RUN</button>
70+
<div id="canvas"><div>
71+
</body>
72+
<script type="text/javascript" src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
73+
<script src="js\cricket.js"></script>
74+
<script src="js\dinic.js"></script>
75+
<script src="js\misc.js"></script>
76+
<script src="js\draw.js"></script>
77+
</html>

Flow/index.html

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<html lang="en">
2+
<head>
3+
<title>Max-Flow</title>
4+
<style>
5+
#canvas{
6+
margin-left: 25%;
7+
width:50vw;
8+
height:50vh;
9+
border:solid 4px black;
10+
}
11+
body{
12+
text-align:center;
13+
}
14+
button{
15+
border-radius: 20px;
16+
border-color:#00FFFF;
17+
background-color: #CCFFFF;
18+
font-size:2vh;
19+
}
20+
21+
label {
22+
width: 90%;
23+
padding: 6px 0 6px 0;
24+
background-color:#FFCCCC;}
25+
span {
26+
color:#FF7777;
27+
}
28+
input{
29+
height:3vh;
30+
width:4vw;
31+
}
32+
.controls{
33+
text-align: center;
34+
float:left;
35+
display:inline-block;
36+
}
37+
</style>
38+
</head>
39+
<body>
40+
<h1>DINIC's MAXFLOW</h1>
41+
Tool for Finding max-flow and min-cut of a network, and its visualization<br>
42+
Uses Dinic Max-flow algorithm for the same. Run time of Dinic's: <span> O(EV^2) </span>
43+
<br>
44+
<br>
45+
<div class="controls">
46+
<div>
47+
<input id="name" value="2"></input> <br><br>
48+
<button id="vertice">Add vertice</button>
49+
</div>
50+
<br>
51+
<br>
52+
<div>
53+
<label for="u">From </label><input id="u"></input>
54+
<label for="v">To </label><input id="v"></input>
55+
<label for="c">Capacity</label><input id="c" value="0"></input> <br><br>
56+
<button id="edge">Add Edge</button>
57+
</div>
58+
<br>
59+
<br>
60+
<button id="maxflow">Maxflow</button><button id="undo">Undo Flow</button>
61+
</div>
62+
63+
64+
<div id="canvas"></div>
65+
66+
<br>
67+
<br>
68+
<br>
69+
<br>
70+
<a href = "cricket.html" style="text-decoration: none;">Cricket game application of Max flow ></a>
71+
72+
<script type="text/javascript" src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
73+
<script src="js\dinic.js"></script>
74+
<script src="js\draw.js"></script>
75+
<script src="js\misc.js"></script>
76+
<script src="js\index.js"></script>
77+
</body>
78+
</html>

Flow/js/cricket.js

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
var add = document.getElementById("add");
2+
var addteam = document.getElementById("addteam");
3+
var table = document.getElementById("table");
4+
var canvas = document.getElementById("canvas");
5+
var run = document.getElementById("run");
6+
7+
var teamsdiv = document.getElementById("teams");
8+
var remaining = document.getElementById("remaining");
9+
var teams =[];
10+
var color = {};
11+
var exist={};
12+
var dataids =[];
13+
var idn=0;
14+
15+
add.addEventListener("click",function(){
16+
if(exist[addteam.value]!=null)return;
17+
18+
teams.push(addteam.value);
19+
exist[addteam.value]=1;
20+
dataids.push([]);
21+
remaining.colSpan=teams.length;
22+
var newdiv = document.createElement("th");
23+
newdiv.innerHTML = addteam.value;
24+
teamsdiv.appendChild(newdiv);
25+
26+
var e = document.createElement("tr");
27+
e.id="r"+(teams.length-1);
28+
for(var i=0;i<teams.length-1+3;i++){
29+
var ee = document.createElement("td");
30+
if(i==0)
31+
ee.innerHTML=addteam.value;
32+
else if(i==1)
33+
inp(ee,0,teams.length-1);
34+
else if(i==2)
35+
inp(ee,0,teams.length-1);
36+
else
37+
inp(ee,0,teams.length-1);
38+
e.appendChild(ee);
39+
}
40+
table.appendChild(e);
41+
42+
var child = table.childNodes;
43+
for(var i=2;i<child.length;i++){
44+
var e = document.createElement("td");
45+
if(i-2==teams.length-1){
46+
inp(e,0,i-2);
47+
e.innerHTML="-";}
48+
else
49+
inp(e,0,i-2)
50+
child[i].appendChild(e);
51+
}
52+
} );
53+
54+
run.addEventListener("click",solve);
55+
56+
function inp(cont,val,index){
57+
var e = document.createElement("input");
58+
e.value=val;
59+
e.id=idn;
60+
dataids[index].push(idn);
61+
idn+=1;
62+
cont.appendChild(e);
63+
}
64+
function collect(){
65+
var win=[],loss=[],left=[],match=[];
66+
for(var i=0;i<teams.length;i++){
67+
match.push([]);
68+
win.push(Number(document.getElementById(dataids[i][0]).value));
69+
loss.push(Number(document.getElementById(dataids[i][1]).value));
70+
var sum=0;
71+
for(var j=0;j<teams.length;j++){
72+
if(i==j){
73+
match[i].push(0);
74+
continue;
75+
}
76+
match[i].push(Number(document.getElementById(dataids[i][j+2]).value));
77+
sum+=Number(document.getElementById(dataids[i][j+2]).value);
78+
}
79+
left.push(Number(sum));
80+
}
81+
return [win,loss,left,match];
82+
}
83+
84+
function solve(){
85+
var data = collect();
86+
var win=data[0],loss=data[1],left=data[2],match=data[3];
87+
88+
for(var node=0;node<teams.length;node++){
89+
var g = new graph(1000);
90+
var z = win[node]+left[node];
91+
g.addvertice("source");
92+
g.addvertice("sink");
93+
for(var i=0;i<teams.length;i++){
94+
if(i == node)continue;
95+
g.addvertice(teams[i]);
96+
g.addEdged(teams[i],"sink",z-win[i]);
97+
}
98+
for(var i=0;i<teams.length;i++){
99+
if(i==node)continue;
100+
for(var j=i+1;j<teams.length;j++){
101+
if(j==node)continue;
102+
g.addvertice(teams[i]+'-'+teams[j]);
103+
g.addEdged(teams[i]+'-'+teams[j],teams[i],INT_MAX);
104+
g.addEdged(teams[i]+'-'+teams[j],teams[j],INT_MAX);
105+
g.addEdged("source",teams[i]+'-'+teams[j],match[i][j]);
106+
}
107+
}
108+
109+
var flow = DinicMaxflow(g, "source", "sink");
110+
if(node==0)
111+
draw(canvas,g);
112+
var sum = 0;
113+
for(var i=0;i<g.adj[0].length;sum+=Number(g.adj[0][i].c),i++);
114+
115+
if(color[node]==null)color[node]=document.getElementById("r"+node).style.background;
116+
if(sum != flow)
117+
document.getElementById("r"+node).style.background="#FFDDDD";
118+
else
119+
document.getElementById("r"+node).style.background=color[node];
120+
console.log([flow, sum]);
121+
}
122+
}

Flow/js/dinic.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// graph g;
2+
// g.addvertice("sample");
3+
// g.addEdge("sample1","sample2", capacity)
4+
// DinicMaxflow(g, "source", "sink")
5+
6+
class graph {
7+
8+
constructor(n){
9+
this.adj=[]; //n list of adjacent edges
10+
for(var i =0;i<n;this.adj.push([]),i++);
11+
12+
this.ver=[];
13+
this.exist={};
14+
this.size=0;}
15+
16+
addvertice(name){
17+
this.ver.push({name:name});
18+
this.exist[name]=this.size;
19+
this.size+=1;
20+
}
21+
addEdge(a, b, c, f) {
22+
this.adj[a].push({ u:a,v:b,rev:-1,c: c,f:f });
23+
return this.adj[a].length - 1;
24+
}
25+
addEdged(a, b, c) {
26+
a = this.exist[a];
27+
b = this.exist[b];
28+
var a1 = this.addEdge(a, b, c, 0);
29+
var a2 = this.addEdge(b, a, 0, 0);
30+
this.adj[a][a1].rev = a2;
31+
this.adj[b][a2].rev = a1;
32+
}
33+
}
34+
35+
function bfs(g, level, s, t) {
36+
var queue=[];
37+
queue.push(s);
38+
for (var i = 0; i <= g.size; i++)
39+
level[i]=-1;
40+
level[s] = 0;
41+
42+
while (queue.length) {
43+
var temp = queue.slice();
44+
queue=[];
45+
while (temp.length) {
46+
var node = temp.pop();
47+
for (var i = 0; i < g.adj[node].length; i++) {
48+
var e = g.adj[node][i];
49+
if (level[e.v] != -1 || e.f >= e.c) continue;
50+
queue.push(e.v);
51+
level[e.v] = level[node] + 1;
52+
}
53+
}
54+
}
55+
return level[t] == -1 ? false : true;
56+
}
57+
58+
function sendFlow(g, start,level, u, flow, t)
59+
{
60+
if (u == t)
61+
return flow;
62+
63+
for (; start[u] < g.adj[u].length; start[u]++)
64+
{
65+
var e = g.adj[u][start[u]];
66+
67+
if (level[e.v] == level[u] + 1 && e.f < e.c)
68+
{
69+
var curr_flow = min(flow, e.c - e.f);
70+
71+
var temp_flow = sendFlow(g, start, level, e.v, curr_flow, t);
72+
73+
if (temp_flow > 0)
74+
{
75+
e.f += temp_flow;
76+
g.adj[e.v][e.rev].f -= temp_flow;
77+
return temp_flow;
78+
}
79+
}
80+
}
81+
return 0;
82+
}
83+
84+
function DinicMaxflow(g, s, t)
85+
{
86+
87+
s = g.exist[s];
88+
t = g.exist[t];
89+
if (s == t)
90+
return -1;
91+
92+
var total = 0;
93+
var level = [];
94+
for (var i = 0; i <= g.size; i++)
95+
level.push(-1);
96+
97+
while (bfs(g, level, s, t))
98+
{
99+
var start = [];
100+
for (var i = 0; i <= g.size; i++)
101+
start.push(0);
102+
103+
var flow;
104+
while (flow = sendFlow(g, start, level, s, INT_MAX, t))
105+
total += flow;
106+
}
107+
return total;
108+
}

0 commit comments

Comments
 (0)