using
System;
using
System.Collections.Generic;
public
class
PrecedenceGraph
{
private
int
V;
private
List<
int
>[] adj;
private
List<
int
> serialSchedule =
new
List<
int
>();
public
PrecedenceGraph(
int
V)
{
this
.V = V;
adj =
new
List<
int
>[ V ];
for
(
int
i = 0; i < V; i++) {
adj[i] =
new
List<
int
>();
}
}
public
void
addEdge(
int
v,
int
w) { adj[v].Add(w); }
private
void
computeIndegree(
int
[] indegree)
{
for
(
int
i = 1; i < V; i++) {
foreach
(
int
node
in
adj[i])
{
indegree[node]++;
}
}
}
private
int
findZeroIndegree(
int
[] indegree,
bool
[] visited)
{
for
(
int
i = 1; i < V; i++) {
if
(!visited[i] && indegree[i] == 0) {
visited[i] =
true
;
return
i;
}
}
return
-1;
}
public
void
topologicalSort()
{
bool
[] visited =
new
bool
[V];
int
[] indegree =
new
int
[V];
computeIndegree(indegree);
int
node = findZeroIndegree(indegree, visited);
bool
nodeAvailable =
false
;
if
(node != -1) {
nodeAvailable =
true
;
}
while
(nodeAvailable) {
serialSchedule.Add(node);
foreach
(
int
i
in
adj[node])
{
indegree[i]--;
}
node = findZeroIndegree(indegree, visited);
if
(node == -1) {
nodeAvailable =
false
;
}
}
}
public
void
printSchedule()
{
foreach
(
int
i
in
serialSchedule)
{
Console.Write(
"T"
+ i +
" "
);
}
}
}
public
class
Program {
public
static
void
Main(
string
[] args)
{
PrecedenceGraph graph =
new
PrecedenceGraph(4);
graph.addEdge(2, 1);
graph.addEdge(2, 3);
graph.addEdge(3, 1);
graph.topologicalSort();
Console.Write(
"Equivalent Serial Schedule is: "
);
graph.printSchedule();
}
}