using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace graph3
{
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
int i, j;
//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 ( i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
if (i == j) A[i, j] = 0;
else A[i, j] = 10000000;//initializare infinit unde nu exista muchie
for ( 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
int c = int.Parse(s[2]);//costul
A[v1, v2] = c;//pun in matricea de adiacenta
A[v2, v1] = c;//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 costurilor:");
for ( i = 1; i <= n; i++)
{//scriu matricea costurilor
for (j = 1; j <= n; j++)
if(A[i,j]!=10000000) Console.Write(A[i, j] + " ");
else Console.Write("# ");
Console.WriteLine();
}
//Dijkstra
int[] D = new int[n + 1];//vectorul de lungime a drumului
int[] T = new int[n + 1]; //vectorul de tati
bool[] V = new bool[n + 1]; //vizitat/nevizitat
int k, min;
for (i = 1; i <= n; i++)
{
D[i] = A[x,i];//distanta initiala de la x la fiecare nod
if (i != x && D[i] != 10000000) T[i] = x;//x este tata pt i
}
V[x] = true;
for (k = 1; k < n; k++)
{
min = 10000000;
j = 0;
for (i = 1; i <= n; i++)
if (!V[i] && D[i] < min)//caut nodul cu dist minima legat de x
{
min = D[i];//dist min
j = i;//nodul la dist min
}
for (i = 1; i <= n; i++)
if (!V[i])
if (D[i] > D[j] + A[j,i])//daca e mai scurt prin j
{
D[i] = D[j] + A[j,i];//actualizez distanta
T[i] = j;//j este tata lui i
}
V[j] = true;//j a fost folosit
}
//afisari
Console.WriteLine("lungimile minime:");
for (i = 1; i <= n; i++) Console.Write(D[i] + " ");
Console.WriteLine();
Console.WriteLine("vectorul de tati:");
for (i = 1; i <= n; i++) Console.Write(T[i] + " ");
Console.WriteLine();
//afisarea solutiei
if (D[y] != 0)
{
Console.WriteLine("costul minim= " + D[y]);
Console.Write("lantul de cost minim= ");
write_path(y, T);
}
else Console.WriteLine("Nu s-a gasit lant");
Console.ReadKey();
}
}
}
|