Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import std.stdio;
- class Graph
- {
- size_t capacity;
- size_t nodesCount;
- Node nodes;
- Node add_node()
- {
- auto node = new Node(nodesCount);
- if (nodes is null)
- {
- nodes = node;
- }
- else
- {
- auto crnt = nodes;
- while (crnt.next !is null)
- {
- crnt = nodes.next;
- }
- crnt.next = node;
- }
- nodesCount++;
- return node;
- }
- void add_edge(size_t from, size_t to, size_t shift, double weight)
- {
- Node nodeFrom;
- Node nodeTo;
- auto crnt = nodes;
- size_t done = 0;
- while (crnt !is null)
- {
- if (done == from)
- {
- nodeFrom = crnt;
- }
- if (done == to)
- {
- nodeTo = crnt;
- }
- crnt = crnt.next;
- done++;
- }
- auto edge = new Edge(shift, weight, nodeTo);
- if (nodeFrom.edges is null)
- {
- nodeFrom.edges = edge;
- }
- else
- {
- auto crntEdge = nodeFrom.edges;
- while (crntEdge.next !is null)
- {
- crntEdge = crntEdge.next;
- }
- crntEdge.next = edge;
- }
- }
- void eval(size_t i)
- {
- auto node = nodes;
- while (node !is null)
- {
- auto val = (i % 2 == 0) ? node.value0 : node.value1;
- auto edge = node.edges;
- while (edge !is null)
- {
- if (i % 2 == 0 && edge.shift == 0)
- {
- edge.to.value0 += val * edge.weight;
- }
- else if (i % 2 == 0 && edge.shift == 1)
- {
- edge.to.value1 += val * edge.weight;
- }
- else if (i % 2 == 1 && edge.shift == 0)
- {
- edge.to.value1 += val * edge.weight;
- }
- else if (i % 2 == 1 && edge.shift == 1)
- {
- edge.to.value0 += val * edge.weight;
- }
- edge = edge.next;
- }
- node.res = val;
- if (i % 2 == 0)
- {
- node.value0 = 0;
- }
- else
- {
- node.value1 = 0;
- }
- node = node.next;
- }
- }
- }
- class Node
- {
- size_t id;
- Node next;
- double value0;
- double value1;
- double res;
- Edge edges;
- this(size_t id)
- {
- this.id = id;
- this.res = 0;
- this.value0 = 0;
- this.value1 = 0;
- }
- }
- class Edge
- {
- Edge next;
- Node to;
- size_t shift;
- double weight;
- this(size_t shift, double weight, Node to)
- {
- this.shift = shift;
- this.weight = weight;
- this.to = to;
- }
- }
- void main()
- {
- auto g = new Graph();
- auto n1 = g.add_node();
- auto n2 = g.add_node();
- g.add_edge(0, 1, 0, 0.5);
- g.add_edge(1, 1, 1, 0.5);
- foreach(i; 0..3) {
- n1.value0 = 1.0;
- n1.value1 = 1.0;
- g.eval(i%2);
- }
- writeln(n2.res);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement