using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace graph2
{
class Program
{
static void write_path(int v, int[] T)//scrie drumul cel mai scurt pe baza vectorului de tati
{
if (T[v] != 0)//daca are tata
write_path(T[v], T);//merge in el
Console.Write(v + " ");//scrie la revenire, adica in ordine inversa
}
static void Main(string[] args)
{
int n;//nr vf
int[,] A;//matricea de adiacenta
int x, y;//varfurile
//citire
StreamReader fin = new StreamReader("graph.in");//deschide fisierul
n = int.Parse(fin.ReadLine());//citesc numarul de varfuri
int m = int.Parse(fin.ReadLine());//citesc numarul de arce
A = new int[n+1, n+1];//creez matrice a de adiacenta
for (int i = 0; i < m; i++)//citesc ne linii
{
string linie = fin.ReadLine();//o linie
string[] s = linie.Split();//o desparte in trei numere
int v1 = int.Parse(s[0]);//primul varf
int v2 = int.Parse(s[1]);//al doilea varf
A[v1, v2] = 1;//pun in matricea de adiacenta
}
string l = fin.ReadLine();//o linie
string[] ss = l.Split();//o desparte in trei numere
x = int.Parse(ss[0]);//primul varf
y = int.Parse(ss[1]);//al doilea varf
fin.Close();
Console.WriteLine("matricea de adiacenta:");
for (int i = 1; i <= n; i++)
{//scriu matricea de adiacenta
for (int j = 1; j <= n; j++)
Console.Write(A[i, j] + " ");
Console.WriteLine();
}
//parcurgere BF si creare vector de lungimi si de tati
int[] D = new int[n + 1];//vectorul de lungime a drumului
int[] T = new int[n + 1]; //vectorul de tati
int[] X = new int[n + 1]; //vectorul de parcurgere BF (coada)
bool[] V = new bool[n + 1]; //vizitat/nevizitat
//initializari
D[x] = 0;
T[x] = 0;
V[x] = true;
X[1] = x;//incep din x
int st = 1;//limita stanga din x
int dr = 1;//limita dreapta din x
while (st <= dr)//cattimp nu am terminat parcurgerea
{
int i = X[st];//nodul curent pt parcurgere
for(int j=1;j<=n;j++)//iau toate nodurile
if (A[i, j] == 1 && !V[j])//aleg descendentii nevizitati
{
dr++;
X[dr] = j;//adaug pe j in in X
V[j] = true;//marchez ca vizitat pe j
D[j] = D[i] + 1;//se afla cu 1 mai departe decat cel din care am venit
T[j] = i;//retin ca am venit din i in j
}
st++;//trec la urmatorul vf din X
}
//afisari
Console.WriteLine("parcurgerea BF:");
for (int i = 1; i <= dr; i++) Console.Write(X[i] + " ");
Console.WriteLine();
Console.WriteLine("lungimile minime:");
for (int i = 1; i <= dr; i++) Console.Write(D[i] + " ");
Console.WriteLine();
Console.WriteLine("vectorul de tati:");
for (int i = 1; i <= dr; i++) Console.Write(T[i] + " ");
Console.WriteLine();
//afisarea solutiei
if (D[y] != 0)
{
Console.WriteLine("lungimea minima= " + D[y]);
Console.Write("drumul de lungime= ");
write_path(y, T);
}
else Console.WriteLine("Nu s-a gasit drum");
Console.ReadKey();
}
}
}
|