public CGrafo construyeK5() { CGrafo k5 = new CGrafo(1, 0); for (int i = 0; i < 5; i++) { CVertice v = new CVertice(i+1,0,0,Color.White,Color.Black); v.setGrado(4); CNodoVertice cnv = new CNodoVertice(v); k5.getListaAdyacencia().Add(cnv); } foreach (CNodoVertice nv in k5.getListaAdyacencia()) { foreach (CNodoVertice nv2 in k5.getListaAdyacencia()) { if (nv.getVertice().getId() != nv2.getVertice().getId()) { nv.getRelaciones().Add(nv2); nv.getVertice().getVecinos().Add(nv2.getVertice()); if (!k5.aristaRepetida(nv.getVertice(), nv2.getVertice())) { CArista ar = new CArista(nv.getVertice(), nv2.getVertice(),new Point(0,0),new Point(0,0),0); k5.getListaAristas().Add(ar); } } } } k5.setNumeroAristas(10); k5.setNumeroVertices(5); return k5; }
public CGrafo construyeK33() { CGrafo k33 = new CGrafo(1, 0); for (int i = 0; i < 6; i++) { CVertice v = new CVertice(i + 1, 0, 0, Color.White, Color.Black); v.setGrado(3); CNodoVertice cnv = new CNodoVertice(v); k33.getListaAdyacencia().Add(cnv); } for (int i = 0; i < 3; i++) { for (int j = 3; j < 6; j++) { k33.getListaAdyacencia()[i].getRelaciones().Add(k33.getListaAdyacencia()[j]); k33.getListaAdyacencia()[i].getVertice().getVecinos().Add(k33.getListaAdyacencia()[j].getVertice()); k33.getListaAdyacencia()[j].getRelaciones().Add(k33.getListaAdyacencia()[i]); k33.getListaAdyacencia()[j].getVertice().getVecinos().Add(k33.getListaAdyacencia()[i].getVertice()); CArista ar = new CArista(k33.getListaAdyacencia()[i].getVertice(), k33.getListaAdyacencia()[j].getVertice(), new Point(0, 0), new Point(0, 0), 0); k33.getListaAristas().Add(ar); } } k33.setNumeroAristas(9); k33.setNumeroVertices(6); return k33; }
public static bool hayVerticeGradoCero(CNodoVertice cnv) { if (cnv.getVertice().getGrado() == 0) return true; else return false; }
public bool esIncidenteCon(CArista ari, CNodoVertice nodo_od) { bool encontrado = false; if (ari.getVOrigen().getId() == nodo_od.getVertice().getId() || ari.getVDestino().getId() == nodo_od.getVertice().getId()) encontrado = true; return encontrado; }
public bool estaEnListaRelaciones(CNodoVertice nodo, CNodoVertice relacion) { bool encontrado = false; foreach (CNodoVertice cnv in nodo.getRelaciones()) { if (relacion.getVertice().getId() == cnv.getVertice().getId()) { encontrado = true; break; } } return encontrado; }
public void calculaCaminoMasCorto(CNodoVertice origen) { List<CNodoVertice> S = new List<CNodoVertice>(); List<CNodoVertice> P = new List<CNodoVertice>(); List<CNodoVertice> VS; int[] D = new int[n]; S.Add(origen); for (int i = 0; i < n; i++) { D[i] = C[V.IndexOf(origen), i]; P.Add(origen); } for (int j = 0; j < n-1; j++) { VS = VminusS(S); CNodoVertice w = menorVminusS(D,VS); S.Add(w); VS = VminusS(S); foreach (CNodoVertice cnv in VS) { if(G.sonVerticesAdyacentes(cnv.getVertice(),w.getVertice())) { int aux = D[V.IndexOf(cnv)]; if (C[V.IndexOf(w), V.IndexOf(cnv)] == INFINITO) C[V.IndexOf(w), V.IndexOf(cnv)] -= D[V.IndexOf(w)]; D[V.IndexOf(cnv)] = minimoDe(D[V.IndexOf(cnv)], D[V.IndexOf(w)] + C[V.IndexOf(w), V.IndexOf(cnv)]); if (aux != D[V.IndexOf(cnv)]) P[V.IndexOf(cnv)] = w; } } } muestraResultado(D, P, origen); }
public int ordenaPorNumero(CNodoVertice nv1,CNodoVertice nv2) { return nv2.getVertice().getNumero().CompareTo(nv1.getVertice().getNumero()); }
public int ordenaPorID(CNodoVertice nv1, CNodoVertice nv2) { return nv1.getVertice().getId().CompareTo(nv2.getVertice().getId()); }
public bool laRaizTiene2OMasHijos(CNodoVertice cnv_ini) { int num_hijos = 0; foreach (CArista a in arcos_arbol) { CVertice or = a.getVOrigen(), de = a.getVDestino(); int num_or = or.getNumero(), num_de = de.getNumero(); if ((or.getId() == cnv_ini.getVertice().getId() && num_or < num_de) || (de.getId() == cnv_ini.getVertice().getId() && num_de < num_or)) { num_hijos++; } } if (num_hijos >= 2) return true; return false; }
public bool tieneHijosConBajoMayorOIgualAlNumDe(CNodoVertice cnv) { foreach (CArista a in arcos_arbol) { CVertice or = a.getVOrigen(), de = a.getVDestino(); int num_or = or.getNumero(), num_de = de.getNumero(); if (or.getId() == cnv.getVertice().getId() && num_or < num_de && de.getBajo() >= cnv.getVertice().getNumero()) return true; else if (de.getId() == cnv.getVertice().getId() && num_de < num_or && or.getBajo() >= cnv.getVertice().getNumero()) return true; } return false; }
public void RP_RPA(CNodoVertice cnv) { cnv.getVertice().setVisitado(true); foreach (CNodoVertice w in cnv.getRelaciones()) { if (w.getVertice().getVisitado() != true) RP_RPA(w); } cnv.getVertice().setBajo(minimo(cnv.getVertice().getNumero(),getZde(cnv),getYde(cnv))); }
//Puntos de articulacion public void RecorridoEnProfundidadPtosArticulacion(CNodoVertice cnvid) { foreach (CNodoVertice cv in G.getListaAdyacencia()) cv.getVertice().setVisitado(false); if (cnvid.getVertice().getVisitado() != true) RP_RPA(cnvid); foreach (CNodoVertice cnv in G.getListaAdyacencia()) { if (cnv.getVertice().getId() != cnvid.getVertice().getId()) if (cnv.getVertice().getVisitado() != true) RP_RPA(cnv); } }
public void construyeGR() { G.getListaAdyacencia().Sort(ordenaPorNumero); foreach (CNodoVertice nv in G.getListaAdyacencia()) { CNodoVertice nuevo = new CNodoVertice(new CVertice(nv.getVertice().getId(), 0, 0, Color.Transparent, Color.Transparent)); GR.Add(nuevo); } foreach (CNodoVertice cnv in GR) cnv.setRelacionesFC(getListaNuevaDe(cnv)); G.getListaAdyacencia().Sort(ordenaPorID); }
//Recorrido en Amplitud public void recorridoEnAmplitud(CNodoVertice vert_ini) { vert_ini.getVertice().setVisitado(true); List<CNodoVertice> Vp = construyeLAdyPrima(G.getListaAdyacencia(), vert_ini); List<CNodoVertice> Q = new List<CNodoVertice>(); Q.Add(vert_ini); while (Vp.Count != 0) { CNodoVertice u = Q[0]; Q.RemoveAt(0); foreach (CNodoVertice w in u.getRelaciones()) { if (!w.getVertice().getVisitado()) { w.getVertice().setVisitado(true); Q.Add(w); enlistaArcosArbol(u.getVertice(), w.getVertice()); Vp.Remove(w); } } } }
public List<CNodoVertice> construyeLAdyPrima(List<CNodoVertice> lady, CNodoVertice cnv_elim) { List<CNodoVertice> prima = new List<CNodoVertice>(); foreach (CNodoVertice cnv in lady) prima.Add(cnv); prima.Remove(cnv_elim); return prima; }
public void RecorridoEnProfundidad(CNodoVertice cnvid) { if (cnvid.getVertice().getVisitado() != true) { int nd = 0; RP_R(cnvid, ref nd); descendientes[G.getListaAdyacencia().IndexOf(cnvid)] = nd; } foreach (CNodoVertice cnv in G.getListaAdyacencia()) { if (cnv.getVertice().getId() != cnvid.getVertice().getId()) { if (cnv.getVertice().getVisitado() != true) { int nd = 0; RP_R(cnv, ref nd); descendientes[G.getListaAdyacencia().IndexOf(cnv)] = nd; } } } }
//Otros de componentes fuertes public List<CNodoVertice> getListaNuevaDe(CNodoVertice nv) { List<CNodoVertice> listanueva = new List<CNodoVertice>(); foreach (CNodoVertice cnv in G.getListaAdyacencia()) { foreach (CNodoVertice rel in cnv.getRelaciones()) { if (rel.getVertice().getId() == nv.getVertice().getId()) listanueva.Add(getCNVenGR(cnv.getVertice().getId())); } } return listanueva; }
public void RP_R(CNodoVertice cnv,ref int ndes) { cnv.getVertice().setVisitado(true); cnv.getVertice().setNumero(++num); foreach (CNodoVertice w in cnv.getRelaciones()) { if (w.getVertice().getVisitado() != true) { int nd = 0; RP_R(w, ref nd); descendientes[G.getListaAdyacencia().IndexOf(w)] = nd; ndes += nd + 1; enlistaArcosArbol(cnv.getVertice(), w.getVertice()); } } }
public int getYde(CNodoVertice cnv) { List<int> yes =new List<int>(); int ymin = -1; foreach (CArista a in arcos_arbol) { CVertice or = a.getVOrigen(), de = a.getVDestino(); int num_or = or.getNumero(), num_de = de.getNumero(); if (or.getId() == cnv.getVertice().getId() && num_or < num_de) { if(de.getBajo() != 0) yes.Add(de.getBajo()); } else if (de.getId() == cnv.getVertice().getId() && num_de < num_or) { if (or.getBajo() != 0) yes.Add(or.getBajo()); } if (yes.Count != 0) { yes.Sort(); ymin = yes[0]; } } return ymin; }
public void sacaPuntosDeArticulacion(CNodoVertice cnv_ini) { List<CNodoVertice> puntos_articulacion = new List<CNodoVertice>(); if (laRaizTiene2OMasHijos(cnv_ini)) puntos_articulacion.Add(cnv_ini); foreach (CNodoVertice cnv in G.getListaAdyacencia()) { if (cnv.getVertice().getId() != cnv_ini.getVertice().getId() && tieneHijosConBajoMayorOIgualAlNumDe(cnv)) puntos_articulacion.Add(cnv); } if(puntos_articulacion.Count != 0) { string cad = "{ "; foreach (CNodoVertice p in puntos_articulacion) { p.getVertice().setRelleno(Color.LightPink.ToArgb()); p.getVertice().dibujate(Graphics.FromImage(G.getBMP()), G.getBMP(),tp); cad += "(" + p.getVertice().getId().ToString() + ")"; if(puntos_articulacion.IndexOf(p) != puntos_articulacion.Count-1) cad += ", "; } cad += " }. "; MessageBox.Show(" Vértices Cut : "+cad, "Puntos de articulación", MessageBoxButtons.OK, MessageBoxIcon.Information); foreach (CNodoVertice p in puntos_articulacion) { p.getVertice().borrate(Graphics.FromImage(G.getBMP()), G.getBMP(), tp); p.getVertice().setRelleno(Color.LightGoldenrodYellow.ToArgb()); p.getVertice().dibujate(Graphics.FromImage(G.getBMP()), G.getBMP(), tp); } } else MessageBox.Show(" No existen vértices CUT para el Grafo "+G.getId().ToString()+". ","Puntos de articulación", MessageBoxButtons.OK, MessageBoxIcon.Information); }
public int getZde(CNodoVertice cnv) { List<int> zetas; int zmin = -1; if (arcos_arbol.Count != 0 && arcos_retroceso.Count != 0) { zetas = new List<int>(); foreach (CArista a in arcos_retroceso) { if (a.getVOrigen().getId() == cnv.getVertice().getId()) zetas.Add(a.getVDestino().getNumero()); else if (a.getVDestino().getId() == cnv.getVertice().getId()) zetas.Add(a.getVOrigen().getNumero()); } if (zetas.Count != 0) { zetas.Sort(); zmin = zetas[0]; } } return zmin; }
public void CF_R(CNodoVertice cnv,ref List<int> ar,int vuelta) { cnv.getVertice().setVisitado(true); foreach (CNodoVertice w in cnv.getRelaciones()) { if (w.getVertice().getVisitado() != true) { ar.Add(w.getVertice().getId()); CF_R(w,ref ar,vuelta); } } if(vuelta == 1) cnv.getVertice().setNumero(++num); else cnv.getVertice().setNumero(++num2); }
public void muestraResultado(int[] pesos_totales, List<CNodoVertice> caminos,CNodoVertice origen) { string camaux = ""; DataTable dt = new DataTable(); object[] values = new object[3]; int ind = 0; List<int> camino = new List<int>(); bool sincamino = false; dt.Columns.Add("Destino"); dt.Columns.Add("Camino"); dt.Columns.Add("Peso Total"); for (int i = 0; i < pesos_totales.Length; i++) { ind = i; values[0] = V[i].getVertice().getId().ToString(); if (pesos_totales[i] != INFINITO && pesos_totales[i] >= 0) values[2] = " " + pesos_totales[i].ToString(); else { sincamino = true; values[2] = " - "; } while (origen.getVertice().getId() != caminos[ind].getVertice().getId()) { camino.Add(caminos[ind].getVertice().getId()); ind = V.IndexOf(caminos[ind]); } camaux += origen.getVertice().getId().ToString()+", "; for(int y = camino.Count-1;y>=0;y--) camaux += camino[y].ToString() + ", "; camaux += V[i].getVertice().getId().ToString(); if (sincamino) { values[1] = " No existe"; sincamino = false; } else values[1] = camaux; dt.Rows.Add(values); camaux = ""; camino.Clear(); } DDijkstra dij = new DDijkstra(dt, origen.getVertice().getId()); dij.ShowDialog(); }