Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 6

**********************************

DSK_CH.txt
**********************************
7
1 3 2 18 5 15
2 12 3 2
3 7
0 6 4 3 5 8
0 9 5 4
6 2
2 4
********************************
DSK_VH.txt
*******************************
7
1 3 2 18 3 6 4 9 5 15
0 3 2 12 3 2
0 18 1 12 3 7 6 4
0 6 1 2 2 7 4 3 5 8
0 9 3 3 5 4
0 15 3 8 4 4 6 2
2 4 5 2
********************************
GraphDSK_TS.cs
********************************
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DucPhuong_B07
{
class GraphDSK_TS
{
// Cau truc cho do thi g co huong
LinkedList<Tuple<int, int>>[] v;
int n;
// C�c array l� bi?n to�n c?c ch? ph?c v? cho gi?i thu?t
int[] pre;
int[] dist;
bool[] processed;
//Propeties
public LinkedList<Tuple<int, int>>[] V
{
get { return v; }
set { v = value; }
}
// Contructor
public GraphDSK_TS() { }
public GraphDSK_TS(int k)
{
v = new LinkedList<Tuple<int, int>>[k];
n = k;
}
// Doc file ra ds ke co trong so
public void FileToDSK_TS(string filename)
{
StreamReader sr = new StreamReader(filename);
n = int.Parse(sr.ReadLine());
v = new LinkedList<Tuple<int, int>>[n];

for (int i = 0; i < n; i++)


{
v[i] = new LinkedList<Tuple<int, int>>();
string str = sr.ReadLine();
if (str != "")
{
string[] s = str.Split();
int j = 0;
while (j < s.Length)
{
int t1 = int.Parse(s[j]);
int t2 = int.Parse(s[j + 1]);
Tuple<int, int> t = new Tuple<int, int>(t1, t2);
v[i].AddLast(t);
j = j + 2;
}
}
}
sr.Close();
}
//Xuat do thi ds ke
public void PrintDSK()
{
for (int i = 0; i < v.Length; i++)
{
Console.Write("Dinh " + i + " : ");
foreach (Tuple<int, int> x in v[i])
Console.Write("(" + x.Item1 + ", " + x.Item2 + ") ");
Console.WriteLine();
}
}
// Dijkstra tim duong di ngan nhat tu s den cac dinh con lai
// Ket qua luu trong array dist[], luu vet duong di trong pre[]
// processed[] : danh dau duyet cac dinh
public void Dijkstra(int s)
{
// pre : Luu d?nh n?m tru?c tr�n du?ng t? s di qua
pre = new int[n];
// dist : Luu d? d�i ng�n nh?t t? s d?n c�c d?nh c�n l?i
dist = new int[n];
// processed : ��nh d?u d?nh d� di qua
processed = new bool[n];
// Khoi gan cac gia tri ban dau
for (int i = 0; i < n; i++)
{
dist[i] = int.MaxValue;
pre[i] = s;
processed[i] = false;
}

// Danh dau duyet s


processed[s] = true;
// gan gia tri ban dau cho cac canh (s,i) : dist[i], neu co
foreach (Tuple<int, int> x in v[s])
dist[x.Item1] = x.Item2;
dist[s] = 0;
// L?n lu?t t�m c�c d?nh g?n nh?t d? c?p nh?t dist, pre
for (int i = 0; i < n; i++)
{
int a; // chon dinh a gan nhat
a = dmin();
processed[a] = true; // Danh dau duyet a
// Cap nhat lai cac gia tri trong dist[] cho cac dinh con lai,
// T�m d?nh trung gian b m� qua d� s? ng?n hon
for (int b = 0; b < n; b++)
{
int ab = weight(a, b);
if (processed[b] == false && ab < int.MaxValue && (dist[b] >
dist[a] + weight(a, b)))
{
dist[b] = dist[a] + weight(a, b);
pre[b] = a;
}
}
}
}
// Ham chon dinh gan nhat
public int dmin()
{
int min = int.MaxValue; // xuat phat min la gia tri lon nhat
int vmin = 0; // dinh tra ve
for (int i = 0; i < n; i++)
{
if (processed[i] == false && dist[i] < min)
{
min = dist[i]; vmin = i;
}
}
return vmin;
}
// Ham lay trong so canh (a,b)
public int weight(int a, int b)
{
int wt = int.MaxValue;
foreach (Tuple<int, int> x in v[a])
{
if (x.Item1 == b)
{
wt = x.Item2; break;
}
}
return wt;
}
// T�m du?ng di ng?n nh?t t? x d?n y, su dung dist[] va pre[] la ket qua
cua Dijkstra(x)
public void MinXY(int x, int y)
{
Dijkstra(x);
Console.WriteLine(dist[y]);
Console.WriteLine(pre[y]);
}
int min(int a, int b)
{
Dijkstra(a);
return dist[b];
}
// T�m du?ng ng?n nh?t t? x d?n y qua d?nh trung gian z, su dung dist[] va
pre[]
public void MinXYZ(int x, int y, int z)
{
Console.WriteLine(min(x, z) + min(z, y));
}
// Chon thanh pho de hop
public int ChonThanhpho()
{
int[,] a = new int[v.Length, v.Length];
for (int i = 0; i < v.Length; i++)
{
Dijkstra(i);
for (int j = 0; j < v.Length; j++)
{
a[i, j] = dist[j];
}
}
int min = 0;
int[] b = new int[v.Length];
for (int i = 0; i < b.Length; i++)
{
b[i] = 0;
}
for (int i = 0; i < v.Length; i++)
{
for (int j = 0; j < v.Length; j++)
{
if (a[i, j] > b[i])
{
b[i] = a[i, j];
}
}
}
min = 1000000;
for (int i = 0; i < b.Length; i++)
{
if (b[i] < min)
{
min = b[i];
}
}
return min;
}

}
}

**************************************************
Program.cs
*************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DucPhuong_B07
{
class Program
{
static int Menu()
{
int chon;
Console.WriteLine();
Console.WriteLine(" DIJSTRA - TIM DUONG DI NGAN NHAT");
Console.WriteLine(" 1. Tao do thi tu file");
Console.WriteLine(" 2. Xuat do thi DSK len man hinh");
Console.WriteLine(" 3. Duong di ngan nhat tu mot dinh den cac dinh con
lai");
Console.WriteLine(" 4. Duong di ngan nhat tu x den y");
Console.WriteLine(" 5. Duong di ngan nhat qua tu x den y qua dinh
trung gian z");
Console.WriteLine(" 6. Bai toan tim duong di ra bien");
Console.WriteLine(" 7. Chon thanh pho de hop");
Console.WriteLine(" 0. Thoat");
Console.Write(" Chon : ");
chon = int.Parse(Console.ReadLine());
Console.WriteLine(" **************************************");

return chon;
}
static void Main(string[] args)
{
GraphDSK_TS g = new GraphDSK_TS();
int chon;
do
{
chon = Menu();
Console.WriteLine();
switch (chon)
{
case 1: { g.FileToDSK_TS("../../TextFile/DSK_CH.txt"); break; }
case 2:
{
Console.WriteLine("Do thi DSK : ");
g.PrintDSK();
break;
}
case 3:
{
Console.WriteLine("Duong di ngan nhat tu dinh s den cac
dinh con lai : ");
Console.Write(" Nhap dinh s : ");
int s = int.Parse(Console.ReadLine());
g.Dijkstra(s);
Console.WriteLine();
break;
}
case 4:
{
Console.WriteLine("Tim duong di ngan nhat tu dinh x den
dinh y");
Console.Write(" Nhap dinh x : ");
int x = int.Parse(Console.ReadLine());
Console.Write(" Nhap dinh y : ");
int y = int.Parse(Console.ReadLine());
g.MinXY(x, y);
break;
}
case 5:
{
Console.WriteLine("Tim duong di ngan nhat tu dinh x den
dinh y qua dinh trung gian z");
Console.Write(" Nhap dinh x : ");
int x = int.Parse(Console.ReadLine());
Console.Write(" Nhap dinh y : ");
int y = int.Parse(Console.ReadLine());
Console.Write(" Nhap dinh z : ");
int z = int.Parse(Console.ReadLine());
g.MinXYZ(x, y, z);
break;
}
case 6:
{
Console.WriteLine(" BAI TOAN TIM DUONG RA BIEN");
//g.FileToMatran(); // Doc ma tran.txt -> ma tran ->
DSK
//g.DSKtoFile(); // dung tao file DSKrabien.txt
Console.WriteLine(" Nhap diem xuat phat : ");
Console.Write(" Nhap toa do x : ");
int x = int.Parse(Console.ReadLine());
Console.Write(" Nhap toa do y : ");
int y = int.Parse(Console.ReadLine());
int s = 6 * x + y; // Xac dinh dinh ruong ung
Console.WriteLine();
g.FileToDSK_TS("../../TextFile/DSKrabien.txt");
g.Dijkstra(s);
Console.WriteLine();
//g.Duongrabien(x, y);

break;
}
case 7:
{
Console.WriteLine(" BAI TOAN CHON THANH PHO DE
HOP");
GraphDSK_TS gtp = new GraphDSK_TS();
gtp.FileToDSK_TS("../../TextFile/DSK_VH.txt");
gtp.PrintDSK();
int tp;
tp = g.ChonThanhpho();
Console.WriteLine("Thanh pho duoc chon : " + tp);
break;
}
}
} while (chon != 0);
}
}
}

You might also like