import platform
platform.platform()
platform.python_version()
import networkx as nx
nx.__version__
from pylab import *
%matplotlib inline
import matplotlib.gridspec as gridspec
import matplotlib as plt
plt.__version__
from IPython.core.display import Image
import DSTG
digraf1=nx.DiGraph([('u','x'),('v','u'),('v','x'),('w','u'),('x','w')])
DSTG.crtaj_graphviz(digraf1,'digraf1.png',slika=(2,2),bojaVrha='yellow',tezine=False,xy={"u":[0,1],"v":[1,1],"w":[0,0],"x":[1,0]})
figure(figsize=(2.5,2.5))
nx.draw(digraf1,pos={"u":[0,1],"v":[1,1],"w":[0,0],"x":[1,0]},with_labels=True,node_color='y',node_size=500)
Outstupanj vrha v
digraf1.out_degree('v')
Instupanj vrha v
digraf1.in_degree('v')
outstupnjevi svih vrhova
digraf1.out_degree()
instupnjevi svih vrhova
digraf1.in_degree()
outstupnjevi vrhova u i v
digraf1.out_degree(['u','v'])
instupnjevi vrhova u i v
digraf1.in_degree(['u','v'])
možemo tražiti stupnjeve vrhova u pripadnom grafu
digraf1.degree()
matrica susjedstva
vrhovi se smještaju u matricu susjedstva onim redom kojim su u listi digraf1.nodes()
digraf1.nodes()
nx.adj_matrix(digraf1).todense()
nx.to_pandas_adjacency(digraf1,dtype=int)
lukovi prema vrhu x
digraf1.in_edges('x')
lukovi iz vrha x
digraf1.out_edges('x')
vrhovi prema kojima postoji luk iz vrha x (out-susjedi vrha x)
list(digraf1.neighbors('x'))
list(digraf1.successors('x'))
vrhovi iz kojih postoji luk prema vrhu x (in-susjedi vrha x)
list(digraf1.predecessors('x'))
da li je digraf povezan
nx.is_connected(digraf1.to_undirected())
komponente povezanosti - ima samo jednu komponentu jer je digraf povezan
list(nx.connected_components(digraf1.to_undirected()))
da li je digraf dipovezan (jako povezan)
nx.is_strongly_connected(digraf1)
dikomponente - digraf1 ima dvije dikomponente
list(nx.strongly_connected_components(digraf1))
dikomponente kao inducirani podgrafovi
dikomponente=list(nx.strongly_connected_component_subgraphs(digraf1))
dikomponente
DSTG.crtaj_graphviz(dikomponente[0],'dikomp1.png',slika=(2,2),bojaVrha='yellow',tezine=False,xy={"u":[0,1],"w":[0,0],"x":[1,0]})
DSTG.crtaj_graphviz(dikomponente[1],'dikomp2.png',slika=(1,1),bojaVrha='yellow',tezine=False)
gs1=gridspec.GridSpec(1, 2,width_ratios=[3,1])
subplot(gs1[0])
axis('off')
imshow(imread('dikomp1.png'),aspect='equal',interpolation='bicubic')
subplot(gs1[1])
axis('off')
imshow(imread('dikomp2.png'),interpolation='bicubic');
da li digraf nema usmjerenih ciklusa
nx.is_directed_acyclic_graph(digraf1)
najkraći usmjereni put od vrha $v$ prema vrhu $u$ i njegova duljina
nx.shortest_path(digraf1,'v','u')
nx.shortest_path_length(digraf1,'v','u')
najkraći usmjereni putovi od vrha $u$ prema svim preostalim vrhovima i njihove udaljenosti
nx.shortest_path(digraf1,'u')
nx.shortest_path_length(digraf1,'u')
digraf2=nx.DiGraph([('u','v'),('v','u'),('v','x'),('w','u'),('w','x')])
DSTG.crtaj_graphviz(digraf2,'digraf2.png',slika=(2,2),bojaVrha='yellow',tezine=False,xy={"u":[0,1],"v":[1,1],"w":[0,0],"x":[1,0]})
figure(figsize=(2.5,2.5))
nx.draw(digraf2,pos={"u":[0,1],"v":[1,1],"w":[0,0],"x":[1,0]},with_labels=True,node_color='y',node_size=500)
matrica susjedstva
digraf2.nodes()
nx.adj_matrix(digraf2).todense()
nx.to_pandas_adjacency(digraf2,dtype=int)
digraf nije dipovezan
nx.is_strongly_connected(digraf2)
digraf ima tri dikomponente
list(nx.strongly_connected_components(digraf2))
dikomponente kao inducirani podgrafovi
dikomponente2=list(nx.strongly_connected_component_subgraphs(digraf2))
dikomponente2
dikomponente2[0].nodes(),dikomponente2[1].nodes(),dikomponente2[2].nodes()
DSTG.crtaj_graphviz(dikomponente2[1],'dikomp3.png',slika=(2,2),bojaVrha='yellow',tezine=False,xy={"u":[0,1],"v":[1,1]})
DSTG.crtaj_graphviz(dikomponente2[0],'dikomp4.png',slika=(1,1),bojaVrha='yellow',tezine=False)
DSTG.crtaj_graphviz(dikomponente2[2],'dikomp5.png',slika=(1,1),bojaVrha='yellow',tezine=False)
gs2=gridspec.GridSpec(1, 3, width_ratios=[3,1,1])
subplot(gs2[0])
axis('off')
imshow(imread('dikomp3.png'),interpolation='bicubic')
subplot(gs2[1])
axis('off')
imshow(imread('dikomp4.png'),interpolation='bicubic')
subplot(gs2[2])
axis('off')
imshow(imread('dikomp5.png'),interpolation='bicubic');
digraf2 sadrži usmjerene cikluse
nx.is_directed_acyclic_graph(digraf2)
digraf3=nx.MultiDiGraph([('u','v'),('u','v'),('v','x'),('w','u'),('w','x')])
DSTG.crtaj_graphviz(digraf3,'digraf3.png',slika=(2,2),bojaVrha='yellow',tezine=False,xy={"u":[0,1],"v":[1,1],"w":[0,0],"x":[1,0]})
matrica susjedstva
digraf3.nodes()
nx.adj_matrix(digraf3).todense()
nx.to_pandas_adjacency(digraf3,dtype=int)
digraf nije dipovezan
nx.is_strongly_connected(digraf3)
digraf ima četiri dikomponente
list(nx.strongly_connected_components(digraf3))
digraf ne sadrži usmjerene cikluse
nx.is_directed_acyclic_graph(digraf3)
digraf4=nx.DiGraph([('u1','u3'),('u2','u1'),('u3','u2'),('u4','u1'),('u4','u3')])
DSTG.crtaj_graphviz(digraf4,'digraf4.png',slika=(3,3),bojaVrha='yellow',tezine=False,xy={"u1":[0,0],"u2":[2,0],"u3":[1,1],"u4":[1,2]})
figure(figsize=(3,3))
nx.draw(digraf4,pos={"u1":[0,0],"u2":[2,0],"u3":[1,1],"u4":[1,2]},with_labels=True,node_color='y',node_size=500)
matrica susjedstva
digraf4.nodes()
mat4=nx.adj_matrix(digraf4).todense();mat4
nx.to_pandas_adjacency(digraf4,dtype=int)
ukupni broj usmjerenih $(u_1,u_2)$-šetnji duljine 2
mat4**2
(mat4**2)[0,2]
ukupni broj usmjerenih $(u_2,u_1)$-šetnji duljine 2
(mat4**2)[2,0]
ukupni broj usmjerenih $(u_4,u_3)$-šetnji duljine 5
(mat4**5)[3,1]
digraf5=nx.DiGraph([('v1','v2'),('v1','v4'),('v2','v4'),('v3','v2'),('v4','v3')])
DSTG.crtaj_graphviz(digraf5,'digraf5.png',slika=(3,3),bojaVrha='yellow',tezine=False,xy={"v1":[0,2],"v2":[0,0],"v3":[2,0],"v4":[2,2]})
figure(figsize=(3,3))
nx.draw(digraf5,pos={"v1":[0,2],"v2":[0,0],"v3":[2,0],"v4":[2,2]},with_labels=True,node_color='y',node_size=500)
digraf4 i digraf5
figure(figsize=(9,7))
gs3=gridspec.GridSpec(1, 2)
subplot(gs3[0])
axis('off')
imshow(imread('digraf4.png'),interpolation='bicubic')
subplot(gs3[1])
axis('off')
imshow(imread('digraf5.png'),interpolation='bicubic');
digraf4 i digraf5 su izomorfni digrafovi
DM=nx.isomorphism.DiGraphMatcher(digraf4,digraf5)
DM.is_isomorphic()
izomorfizam: $u_1\leftrightarrow v_2,\ \ u_2\leftrightarrow v_3,\ \ u_3\leftrightarrow v_4,\ \ u_4\leftrightarrow v_1$
DM.mapping
postoji samo jedan izomorfizam između digrafova digraf4 i digraf5
for u in DM.isomorphisms_iter():
print(u)
turnir=nx.DiGraph([('a','c'),('a','d'),('b','a'),('b','c'),('b','e'),('c','f'),('d','b'),('d','c'),
('e','a'),('e','c'),('e','d'),('e','f'),('f','a'),('f','b'),('f','d')])
turpoz={'a':[2,0],'b':[4,0],'c':[6,2],'d':[4,4],'e':[2,4],'f':[0,2]}
DSTG.crtaj_graphviz(turnir,'turnir.png',slika=(5,3),bojaVrha='yellow',tezine=False,xy=turpoz,fontV=20)
vektor uspjeha turnira
turnir.out_degree()
list(dict(turnir.out_degree()).values())
najkraći usmjereni put od vrha a do vrha d
nx.shortest_path(turnir,'a','d')
najkraći usmjereni put od vrha a do vrha e
nx.shortest_path(turnir,'a','e')
najkraći put istaknut na digrafu
DSTG.graphviz_najkraci_put(turnir,'a','d',"turnir_ad.png",slika=(5,3),xy=turpoz,tezine=False,fontV=20)
DSTG.graphviz_najkraci_put(turnir,'a','e',"turnir_ae.png",slika=(5,3),xy=turpoz,tezine=False,fontV=20)
Za traženje usmjerenih ciklusa u bilo kojem digrafu, implementiran je Brentov algoritam. Taj algoritam za zadani digraf daje neki, na slučajni način pronađeni, usmjereni ciklus.
nekoliko usmjerenih ciklusa u našem promatranom turniru
for i in range(5):
print(DSTG.usmjereni_ciklus(turnir))
nekoliko usmjerenih ciklusa istaknutih na digrafu
DSTG.graphviz_usmjereni_ciklus(turnir,"ciklus1.png",slika=(5,3),xy=turpoz,tezine=False,fontV=20)
DSTG.graphviz_usmjereni_ciklus(turnir,"ciklus2.png",slika=(5,3),xy=turpoz,tezine=False,fontV=20)
DSTG.graphviz_usmjereni_ciklus(turnir,"ciklus3.png",slika=(5,3),xy=turpoz,tezine=False,fontV=20)
DSTG.graphviz_usmjereni_ciklus(turnir,"ciklus4.png",slika=(5,3),xy=turpoz,tezine=False,fontV=20)
promatrani turnir nije Eulerov digraf
nx.is_eulerian(turnir)
trokut1=nx.DiGraph([("a","b"),("b","c"),("c","a")])
trokut2=nx.DiGraph([("a","b"),("a","c"),("b","c")])
trokutpoz={"a":[0,0],"b":[2,0],"c":[1,1.5]}
DSTG.crtaj_graphviz(trokut1,'trokut1.png',slika=(2,2),bojaVrha='yellow',tezine=False,xy=trokutpoz)
DSTG.crtaj_graphviz(trokut2,'trokut2.png',slika=(2,2),bojaVrha='yellow',tezine=False,xy=trokutpoz)
trokut1 je Eulerov digraf, a trokut2 nije Eulerov digraf
nx.is_eulerian(trokut1)
nx.is_eulerian(trokut2)
Image(filename="turnir.png")
DSTG.rang_lista(turnir)
DSTG.rang_lista(turnir,izlaz='lista')
rang lista za turnir2
turnir2=nx.DiGraph([("A","B"),("A","C"),("A","D"),("B","D"),
("B","E"),("C","B"),("C","D"),("E","A"),("E","C"),("E","D")])
T2=nx.nx_agraph.to_agraph(turnir2)
T2.node_attr['shape']='circle'
T2.node_attr['style']='filled'
T2.node_attr['fillcolor']='yellow'
T2.draw('turnir2.png',prog='circo')
Image(filename="turnir2.png")
DSTG.rang_lista(turnir2)
DSTG.rang_lista(turnir2,izlaz='lista')
rang lista za turnir3
turnir3=nx.DiGraph([("A","C"),("A","D"),("B","A"),("B","C"),("B","E"),
("C","D"),("D","B"),("E","A"),("E","C"),("E","D")])
T3=nx.nx_agraph.to_agraph(turnir3)
T3.node_attr['shape']='circle'
T3.node_attr['style']='filled'
T3.node_attr['fillcolor']='yellow'
T3.draw('turnir3.png',prog='circo')
Image(filename="turnir3.png")
DSTG.rang_lista(turnir3)
digraf6 - Bellman-Ford i Dijkstra dobro rade
digraf6=nx.DiGraph([('v1','v2',{'weight':1}),('v1','v5',{'weight':4}),
('v2','v3',{'weight':1}),('v2','v5',{'weight':3}),
('v3','v4',{'weight':5}),('v3','v5',{'weight':1}),
('v4','v3',{'weight':1}),('v5','v3',{'weight':1}),
('v5','v4',{'weight':1})])
D6pos={'v1':[0,2],'v2':[2,4],'v3':[5,4],'v4':[6,0],'v5':[2,0]}
nx.single_source_bellman_ford(digraf6,'v1')
nx.single_source_bellman_ford_path(digraf6,'v1')
nx.single_source_bellman_ford_path_length(digraf6,'v1')
list(nx.all_pairs_bellman_ford_path(digraf6))
list(nx.all_pairs_bellman_ford_path_length(digraf6))
nx.bellman_ford_predecessor_and_distance(digraf6,'v1')
nx.bellman_ford_path(digraf6,'v1','v4')
nx.bellman_ford_path_length(digraf6,'v1','v4')
nx.negative_edge_cycle(digraf6)
DSTG.rucni_BellmanFord(digraf6,'v1',poredak=['v1','v2','v3','v4','v5'])
DSTG.BellmanFord(digraf6,'v1')
DSTG.graphviz_stablo_min_putova(digraf6,'v1',"D6.png",algoritam=DSTG.BellmanFord,slika=(7,6),
xy=D6pos,vrh0="yellow",vrh1="pink",brid0="red",brid1="black",
bojaTezine="black",d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):12},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
DSTG.rucni_Dijkstra_digraf(digraf6,'v1',poredak=['v1','v2','v3','v4','v5'])
DSTG.Dijkstra_digraf(digraf6,'v1')
DSTG.graphviz_stablo_min_putova(digraf6,'v1',"D6dva.png",algoritam=DSTG.Dijkstra_digraf,slika=(7,6),
xy=D6pos,vrh0="yellow",vrh1="pink",brid0="red",brid1="black",
bojaTezine="black",d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):12},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
pogledajmo još iz vrha $v_4$ kao početnog vrha
DSTG.rucni_BellmanFord(digraf6,'v4',poredak=['v1','v2','v3','v4','v5'])
DSTG.BellmanFord(digraf6,'v4')
DSTG.graphviz_stablo_min_putova(digraf6,'v4',"D6tri.png",algoritam=DSTG.BellmanFord,slika=(7,6),
xy=D6pos,vrh0="yellow",vrh1="pink",brid0="red",brid1="black",
bojaTezine="black",d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):12},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
DSTG.rucni_Dijkstra_digraf(digraf6,'v4',poredak=['v1','v2','v3','v4','v5'])
DSTG.Dijkstra_digraf(digraf6,'v4')
DSTG.graphviz_stablo_min_putova(digraf6,'v4',"D6cetiri.png",algoritam=DSTG.Dijkstra_digraf,slika=(7,6),
xy=D6pos,vrh0="yellow",vrh1="pink",brid0="red",brid1="black",
bojaTezine="black",d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):12},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
digraf7 - zbog negativnih težina Dijkstra ne radi dobro; a kako nema negativnih ciklusa, Bellman-Ford radi ispravno
digraf7=nx.DiGraph([('v1','v2',{'weight':1}),('v1','v5',{'weight':4}),
('v2','v3',{'weight':2}),('v2','v5',{'weight':3}),
('v3','v4',{'weight':5}),('v3','v5',{'weight':4}),
('v4','v3',{'weight':-1}),('v5','v3',{'weight':1}),
('v5','v4',{'weight':-1})])
DSTG.rucni_BellmanFord(digraf7,'v1',poredak=['v1','v2','v3','v4','v5'])
DSTG.BellmanFord(digraf7,'v1')
nx.negative_edge_cycle(digraf7)
DSTG.graphviz_stablo_min_putova(digraf7,'v1',"D7.png",algoritam=DSTG.BellmanFord,slika=(7,6),xy=D6pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):14},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
DSTG.rucni_Dijkstra_digraf(digraf7,'v1',poredak=['v1','v2','v3','v4','v5'])
DSTG.Dijkstra_digraf(digraf7,'v1')
DSTG.graphviz_stablo_min_putova(digraf7,'v1',"D7dva.png",algoritam=DSTG.Dijkstra_digraf,slika=(7,6),xy=D6pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):14},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
digraf8 - ima usmjereni ciklus negativne težine. Stoga, niti Bellman-Ford, niti Dijkstra ne rade dobro na ovom digrafu.
digraf8=nx.DiGraph([('v1','v2',{'weight':1}),('v1','v5',{'weight':4}),
('v2','v3',{'weight':2}),('v2','v5',{'weight':3}),
('v3','v4',{'weight':5}),('v3','v5',{'weight':1}),
('v4','v3',{'weight':-1}),('v5','v3',{'weight':1}),
('v5','v4',{'weight':-1})])
DSTG.rucni_BellmanFord(digraf8,'v1',poredak=['v1','v2','v3','v4','v5'])
DSTG.BellmanFord(digraf8,'v1')
nx.negative_edge_cycle(digraf8)
DSTG.graphviz_stablo_min_putova(digraf8,'v1',"D8.png",algoritam=DSTG.BellmanFord,slika=(7,6),xy=D6pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):14},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
DSTG.rucni_Dijkstra_digraf(digraf8,'v1',poredak=['v1','v2','v3','v4','v5'])
DSTG.Dijkstra_digraf(digraf8,'v1')
DSTG.graphviz_stablo_min_putova(digraf8,'v1',"D8dva.png",algoritam=DSTG.Dijkstra_digraf,slika=(7,6),xy=D6pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
d={('v4','v3'):10,('v3','v4'):15,('v5','v3'):15,('v3','v5'):15,('v1','v5'):10,('v2','v5'):14},
kut={('v4','v3'):-3,('v3','v4'):-1,('v5','v3'):-1,('v3','v5'):-2,('v1','v5'):5,('v2','v5'):3})
digraf9 - digraf sadrži usmjereni ciklus negativne težine koji se dvaput obišao u toku izvođenja Bellman-Fordovog algoritma i naravno dobivamo krive rezultate. U ovom slučaju Dijkstra radi ispravno, ali to je samo splet okolnosti zbog same strukture digrafa koja ovdje dobro odgovara Dijkstrinom algoritmu iz vrha $v_1$ (općenito ne možemo garantirati točnost rezultata).
digraf9=nx.DiGraph([('v1','v2',{'weight':3}),('v2','v3',{'weight':-2}),
('v3','v4',{'weight':1}),('v4','v2',{'weight':-1}),
('v4','v5',{'weight':1}),('v5','v6',{'weight':1}),
('v6','v7',{'weight':1}),('v7','v8',{'weight':1})])
D9pos={'v1':[0,0.5],'v2':[2,0.4],'v3':[4,1],'v4':[6,0.4],
'v5':[8,0.4],'v6':[10,0.3],'v7':[12,1],'v8':[8,2]}
nx.negative_edge_cycle(digraf9)
DSTG.rucni_BellmanFord(digraf9,'v1')
DSTG.BellmanFord(digraf9,'v1')
DSTG.graphviz_stablo_min_putova(digraf9,'v1',"D9.png",algoritam=DSTG.BellmanFord,slika=(9,8),xy=D9pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
fontV=16,debljinaE=2,fontE=16)
DSTG.rucni_Dijkstra_digraf(digraf9,'v1')
DSTG.Dijkstra_digraf(digraf9,'v1')
DSTG.graphviz_stablo_min_putova(digraf9,'v1',"D9dva.png",algoritam=DSTG.Dijkstra_digraf,slika=(9,8),xy=D9pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
fontV=16,debljinaE=2,fontE=16)
digraf10 - iako ima usmjereni ciklus negativne težine, Bellman-Ford radi ispravno iz vrha $v_1$ kao početnog vrha, zato jer se taj negativni ciklus ne može doseći iz vrha $v_1$ pa su rezultati točni i možemo garantirati njihovu točnost. Dijkstra također radi ispravno iz vrha $v_1$, ali općenito ne možemo garantirati njegovu točnost.
digraf10=nx.DiGraph([('v1','v4',{'weight':1}),('v2','v1',{'weight':1}),
('v2','v3',{'weight':1}),('v3','v2',{'weight':-2}),
('v3','v4',{'weight':1})])
D10pos={'v1':[0,2],'v2':[4,3],'v3':[7,3.5],'v4':[1,0]}
nx.negative_edge_cycle(digraf10)
DSTG.rucni_BellmanFord(digraf10,'v1')
DSTG.BellmanFord(digraf10,'v1')
DSTG.graphviz_stablo_min_putova(digraf10,'v1',"D10.png",algoritam=DSTG.BellmanFord,slika=(7,6),xy=D10pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
d={('v2','v3'):10,('v3','v2'):10,('v1','v4'):8},
kut={('v2','v3'):-2,('v3','v2'):-2,('v1','v4'):5})
DSTG.rucni_Dijkstra_digraf(digraf10,'v1')
DSTG.Dijkstra_digraf(digraf10,'v1')
DSTG.graphviz_stablo_min_putova(digraf10,'v1',"D10dva.png",algoritam=DSTG.Dijkstra_digraf,slika=(7,6),xy=D10pos,
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
d={('v2','v3'):10,('v3','v2'):10,('v1','v4'):8},
kut={('v2','v3'):-2,('v3','v2'):-2,('v1','v4'):5})
algoritam Dijkstra_graf primijenjen na težinski graf
graf=nx.Graph([('A','B',{'weight':5}),('A','C',{'weight':2}),
('A','D',{'weight':4}),('A','E',{'weight':10}),
('B','D',{'weight':8}),('C','E',{'weight':7}),
('C','F',{'weight':5}),('D','E',{'weight':6}),
('D','G',{'weight':2}),('E','F',{'weight':3}),
('E','G',{'weight':2}),('E','H',{'weight':3}),
('F','H',{'weight':2}),('F','I',{'weight':4}),
('G','H',{'weight':3}),('H','I',{'weight':5})])
grafPOS={'A':[-2,0],'B':[-2,2],'C':[-2,-2],'D':[0,2],'E':[0,0],
'F':[0,-2],'G':[2,2],'H':[2,0],'I':[2,-2]}
DSTG.rucni_Dijkstra_graf(graf,'A',poredak=['A','B','C','D','E','F','G','H','I'])
DSTG.Dijkstra_graf(graf,'A')
DSTG.graphviz_stablo_min_putova(graf,'A',"tezinski.png",algoritam=DSTG.Dijkstra_graf,xy=grafPOS,slika=(4,4),
vrh0="yellow",vrh1="pink",brid0="red",brid1="black",bojaTezine="black",
fontE=16,debljinaE=1)
acDigraf=nx.DiGraph([(2,1),(2,4),(3,1),(3,4),(3,5),(4,5),(6,1),(6,4),(7,2),(7,3),(7,6),(7,8),(8,5),(8,6)])
acPOS={1:[0,0],2:[4,0],3:[1,-1],4:[3,-1],5:[2,-2],6:[1,1],7:[3,1],8:[2,2]}
DSTG.crtaj_graphviz(acDigraf,"acDigraf.png",slika=(4,4),tezine=False,bojaVrha="yellow",xy=acPOS,fontV=20,debljinaE=1)
digraf jest aciklički
nx.is_directed_acyclic_graph(acDigraf)
topološki sortirani vrhovi promatranog acikličkog digrafa
list(nx.topological_sort(acDigraf))
graf2=nx.grid_2d_graph(3,3)
graf2=nx.relabel_nodes(graf2,dict(zip(graf2.nodes(),range(9))))
graf2POS={0:[0,0],1:[1,0],2:[2,0],3:[0,1],4:[1,1],5:[2,1],6:[0,2],7:[1,2],8:[2,2]}
DSTG.crtaj_graphviz(graf2,"graf2.png",slika=(3,3),tezine=False,bojaVrha="yellow",xy=graf2POS)
jedna jaka orijentacija na promatranom grafu temeljena na DFS algoritmu iz vrha 0
jaki_graf2=DSTG.DFS_orijentacija(graf2,0)
DSTG.crtaj_graphviz(jaki_graf2,"jaki_graf2.png",slika=(3,3),tezine=False,bojaVrha="yellow",xy=graf2POS)
jedna jaka orijentacija na kubnom grafu
kub=nx.cubical_graph()
poz_kub=nx.shell_layout(kub,[[0,1,2,3],[4,7,6,5]])
DSTG.crtaj_graphviz(kub,"kub.png",slika=(3,3),tezine=False,bojaVrha="yellow",xy=poz_kub,fontV=12,debljinaE=1)
jaki_kub=DSTG.DFS_orijentacija(kub,6)
DSTG.crtaj_graphviz(jaki_kub,"jaki_kub.png",slika=(3,3),tezine=False,bojaVrha="yellow",xy=poz_kub,fontV=12,debljinaE=1)
mreza1=nx.DiGraph([('i','u',{'weight':7}),('i','x',{'weight':2}),
('u','x',{'weight':1}),('u','v',{'weight':5}),
('x','y',{'weight':4}),('v','x',{'weight':3}),
('v','y',{'weight':2}),('v','w',{'weight':4}),
('y','z',{'weight':5}),('w','z',{'weight':3}),
('w','p',{'weight':3}),('z','p',{'weight':6})])
mreza1_pos={'i':[0,2],'x':[2,0],'y':[6,0],'z':[10,0],'p':[12,2],'u':[2,4],'v':[6,4],'w':[10,4]}
nx.draw(mreza1,pos=mreza1_pos,with_labels=True,node_color='y')
nx.draw_networkx_edge_labels(mreza1,pos=mreza1_pos,edge_labels=nx.get_edge_attributes(mreza1,'weight'));
DSTG.crtaj_graphviz(mreza1,"mreza1.png",slika=(8,4),xy=mreza1_pos,bojaVrha="yellow",fontV=18,fontE=18,debljinaE=2,
d={('i','x'):10,('w','p'):10},kut={('i','x'):7,('w','p'):-7})
vrijednost maksimalnog protoka od izvora $i$ do ponora $p$
nx.maximum_flow_value(mreza1,'i','p',capacity='weight')
možemo dobiti i količinu protoka kroz pojedini luk.
nx.maximum_flow(mreza1,'i','p',capacity='weight')
možemo dobiti potrebne informacije u obliku tablice
DSTG.maksimalni_protok(mreza1,'i','p')
možemo općenito tražiti vrijednost maksimalnog protoka između bilo koja dva vrha koja nisu nužno izvor i ponor
nx.maximum_flow_value(mreza1,'i','v',capacity='weight')
DSTG.maksimalni_protok(mreza1,'i','v')
nx.maximum_flow_value(mreza1,'u','z',capacity='weight')
DSTG.maksimalni_protok(mreza1,'u','z')
od vrha $z$ do vrha $u$ ne postoji protok
nx.maximum_flow_value(mreza1,'z','u',capacity='weight')
DSTG.maksimalni_protok(mreza1,'z','u')
minimalni $(i,p)$-rez
vrijednost minimalnog reza i particija vrhova
nx.minimum_cut(mreza1,'i','p',capacity='weight')
bridovi minimalnog reza i pripadna particija vrhova
DSTG.minimalni_rez(mreza1,'i','p')
minimalni rez istaknut na digrafu
DSTG.graphviz_minimalni_rez(mreza1,'i','p',"mreza1.png",slika=(8,4),xy=mreza1_pos,vrh0="yellow",
vrh1="pink",brid0="red",brid1="black",fontV=18,fontE=18,debljinaE=2,
d={('i','x'):10,('w','p'):10},kut={('i','x'):7,('w','p'):-7})
minimalni $(u,z)$-rez
nx.minimum_cut(mreza1,'u','z',capacity='weight')
DSTG.minimalni_rez(mreza1,'u','z')
DSTG.graphviz_minimalni_rez(mreza1,'u','z',"mreza1dva.png",slika=(8,4),xy=mreza1_pos,vrh0="yellow",
vrh1="pink",brid0="red",brid1="black",fontV=18,fontE=18,debljinaE=2,
d={('i','x'):10,('w','p'):10},kut={('i','x'):7,('w','p'):-7})
još jedan primjer s drugom transportnom mrežom
mreza2=nx.DiGraph([('i','A',{'weight':3}),('i','C',{'weight':2}),
('i','E',{'weight':6}),('A','B',{'weight':4}),
('C','D',{'weight':2}),('D','p',{'weight':4}),
('E','F',{'weight':2}),('E','H',{'weight':2}),
('F','B',{'weight':2}),('F','G',{'weight':1}),
('G','p',{'weight':5}),('H','D',{'weight':4}),
('H','G',{'weight':1}),('B','p',{'weight':6})])
mreza2_pos={'i':[0,2],'A':[1,4],'B':[3.5,4],'C':[1,0],'D':[3.5,0],'E':[1.2,2],
'F':[2.25,3.25],'G':[3.5,2],'H':[2.25,1.3],'p':[5,2]}
nx.draw(mreza2,pos=mreza2_pos,with_labels=True,node_color='y')
nx.draw_networkx_edge_labels(mreza2,pos=mreza2_pos,edge_labels=nx.get_edge_attributes(mreza2,'weight'));
DSTG.crtaj_graphviz(mreza2,"mreza2.png",slika=(6,4),xy=mreza2_pos,bojaVrha="khaki",bojaBrida="black",
bojaTezine="blue",fontV=16,fontE=16,debljinaE=1,
d={('i','C'):7,('B','p'):8,('H','D'):6,('F','G'):6,('E','H'):4},
kut={('i','C'):-7,('B','p'):-7,('H','D'):-7,('F','G'):-7,('E','H'):-12})
vrijednost maksimalnog protoka od izvora do ponora
nx.maximum_flow_value(mreza2,'i','p',capacity='weight')
količina protoka kroz pojedine lukove
DSTG.maksimalni_protok(mreza2,'i','p')
minimalni $(i,p)$-rez i particija vrhova
nx.minimum_cut(mreza2,'i','p',capacity='weight')
DSTG.minimalni_rez(mreza2,'i','p')
DSTG.graphviz_minimalni_rez(mreza2,'i','p',"mreza2_rez.png",slika=(6,4),xy=mreza2_pos,bojaTezine="blue",
fontV=16,fontE=16,debljinaE=1,
d={('i','C'):7,('B','p'):8,('H','D'):6,('F','G'):6,('E','H'):4},
kut={('i','C'):-7,('B','p'):-7,('H','D'):-7,('F','G'):-7,('E','H'):-12})