#include<iostream>
#include<fstream.h>
#define max 100 //So thanh pho toi da
#define maxE 10000 //Chi phi toi da cua moi chang duong
#define maxC max*maxE // {+oo}
#define Chua_Di 0
#define Da_Di 1
int dmin = maxE; // Chi phi nho nhat trong tat ca cac changg duong
int C[max+1][max+1],X[max +2],BestWay[max+2],T[max+2];
bool Free[max]; //Free de danh dau
//Free[i] = True neu Tp i chua di qua
int n,m; // n thanh pho va m tuyen duong truc tiep
long MinSpending; //Chi phi hanh trinh toi uu;
void Enter()
{
int i,j;
ifstream f;
f.open( "Nguoi_du_lich.txt");
f>>n>>m;
if(!f.is_open())std::cout<<"Can't able to file. " <<std::endl;
//Khoi tao mang chi phi
for( i=1; i<=n;++i)
for( j=1; j<=n;++j)
{
if( i ==j)C[i][j] =0;
else C[i][j] = maxC;
}
//Nhap chi phi cua m tuyen duong
for( int k=1;k<=m;++k)
{
f>>i>>j>>C[i][j];
C[j][i] = C[i][j];//Chi phi nhu nhau tren 2 chieu
//std::cout<<" "<<C[i][j];
if( C[i][j] <dmin)dmin = C[i][j];
}
}
void Init()
{
Free[1] = Da_Di;
X[1] = 1; //Xuat phat tu thanh pho 1
T[1] = 0; //Chi phi xuat phat bang 0
MinSpending = maxC;
}
void Attempt(int i )
{
for( int j=2;j<=n;++j) //Thu cac Tp tu 2 den n
{
if (Free[j]== Chua_Di) // Neu chua gap Tp di qua
{
X[i] =j; //Thu di
T[i] = T[i-1] + C[X[i-1]][j];
//Chi phi = Chi phi buoc truoc + Chi phi duong di truc tiep;
if( T[i] <MinSpending)
{
//Hien nhien neu co dk nay thi C[X[i-1],j] < +oo
if( i==n)
{
if( (T[n] + C[X[n]][1]) < MinSpending )
{
//Tu X[n] quay lai 1 van ton chi phi it hon truoc
//Cap nhat BestConfig
//BestWay = X;
for( int k =1;k<=n;++k)
BestWay[k] = X[k];
//Chi phi thap hon
MinSpending = T[n] + C[X[n]][1];
}
}
else if( T[i] + (n-i+1)* dmin < MinSpending)
{
Free[j] = Da_Di;//Danh dau thanh pho vua di qua
Attempt(i+1); // Tim cac kha nang chon x[i+1]
Free[j] = Chua_Di; // Bo danh dau
}
}
}
}
}
void PrintResult()
{
if(MinSpending == maxC)
{
std::cout<< "NO SOLUTION. ";
}
else
{
for( int i=1;i<=n;++i)
{
std::cout<<BestWay[i]<< "->";
}
std::cout<<1 << " Cost : " << MinSpending;
}
}
int main()
{
Enter();
Init();
Attempt(2);
PrintResult();
system("pause");
return 0;
}
Home
»
»Unlabelled
» Travelling Salesman
Thursday, November 10, 2011
Subscribe to:
Post Comments (Atom)
Popular Posts
-
Biểu diễn dãy nhị phân có độ dài N dưới dạng x[1...n] Thử các giá trị {0, 1} gán cho x [ i ]. Với mỗi giá trị thử gán x[i] lại thử các giá...
-
Mọi người download AOE 1 Full DOWNLOAD về rồi giải nén ra và vào phần setup chạy trước để phù hợp với cấu hình sau đó chạy thẳng là được DOW...
-
Sinh các hoán vị và tổ hợp 1) Sinh các hoán vị: Mọi tập hợp có n phần tử đều có đánh số các phần tử theo chỉ số k = 1,2,3,..,n. Thí ...
-
Bài viết sau được mình tổng hợp từ nhiều nguồn, với mục đích để tiện cho việc tra cứu và học tập. Mình cũng xin gửi lời cảm ơn chân thành đế...
-
Để liệt kê các chỉnh hợp không lặp chập k của tập S = {1,2,3,.., n} , ta có thể đưa về liệt kê các cấu hình x[1,..,k] trong đó xi thuộc tập ...
-
Sưu tầm: Cho n thành phố đánh số từ 1 đến n và m tuyến giao thông 2 chiều được cho bởi mảng C cấp nxn. Ở đây c[i,j]= c[j,i] = chi phí đường ...
-
Dãy ABC: Cho trước một số nguyên dương N ( N<= 100), hãy tìm một xâu chỉ gồm các ký tự A,B,C thỏa mãn các điều kiện sau: *Có độ dài N *Ha...
-
Sưu tầm: Cho một số nguyên dương n<=30 , hay tìm tất cả các cách phân tích số n thành tổng của các số nguyên dương, các cách phân tích là...
-
Ta gọi phép nén một số nguyên là tính tổng các chữ số của nó. Dễ thấy, sau một số phép nén, thì số còn lại chỉ có một chữ số và ko nén được ...
-
Từng ngồi tù vì vận chuyển tiền giả, song Thanh tiếp tục sang Trung Quốc mua gần 200 triệu đồng tiền giả mang về nước tiêu thụ. Gần 200 triệ...

0 comments:
Post a Comment