Cho em hỏi bài toán người du lịch viết bằng ngôn ngữ C

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi All_Of_Love, 26/2/11.

  1. All_Of_Love

    All_Of_Love Youtube Master Race

    Tham gia ngày:
    26/11/10
    Bài viết:
    57
    Các anh cho em hỏi giờ em có bài toán đi du lịch thế này:
    1 người du lịch xuất phát từ thành phố A đến tất cả các thành phố B,C,D rồi quay về A. Chi phí đi lại giữa các thành phố khác nhau là khác nhau.
    Dùng các mảng 2 chiều ví dụ X[12,10] để thể hiện chi phí du lịch từ thành phố A đến B mất 10 triệu, mảng X[24,5] thể hiện chi phí du lịch từ thành phố B đến D mất 5 triệu... (với quy ước 1 là A, 2 là B, 3 là C và 4 là D)
    Viết chương trình bằng ngôn ngữ C để tìm cách đi sao cho người đó có thể đi du lịch từ A qua tất cả các thành phố khác và quay lại A với chi phí thấp nhất.

    Bài này em có 2 chỗ chưa biết làm là:
    - Làm thế nào có thể cộng dồn chi phí đi từ A đến thành phố D khi đi theo những cách khác nhau (A->B->C->D->A hoặc A->C->B->D->A, ...)
    - Làm thế nào để so sánh chi phí cộng dồn đó cái nào là thấp nhất
    Các anh giúp em với, nếu có code của cả bài này thì tốt quá

    ---------- Post added at 21:18 ---------- Previous post was at 21:11 ----------

    Em quên mất đề bài còn có thêm mỗi thành phố chỉ đến 1 lần.
    Em cám ơn các anh trước!
     
  2. -.-!

    -.-! Donkey Kong

    Tham gia ngày:
    6/10/09
    Bài viết:
    389
    Nơi ở:
    Tầng mây 9th
    Bạn tham khảo đoạn code này nhé :))

    /*
    bai toan nguoi du lich ban hang TSP-sd pp nhanh can
    Input : d1 : so cac thanh pho
    Cac dong tiep theo ghi matran chi phi giua cac thanh pho
    (Do thi la do thi day du )
    Output : tong hanh trinh nho nhat, va ghi lan luot cac thanh pho trong hanh trinh

    */
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>

    int n,a[20],b[20],T[20];
    int c[20][20],dem=0;
    int sum ,cmin,best;


    void read_File()
    {
    int i,j;
    FILE *fn;
    fn=fopen("DuLich.INP","r");
    if(!fn)
    {
    printf("Loi mo tep\n");
    getch();
    exit(0);
    }
    fscanf(fn,"%d",&n);
    printf("\n So thanh pho:: %d",n);
    printf("\n Ma tran chi phi::\n");
    for(i=1;i<=n;i++)
    {
    printf("\n");
    for(j=1;j<=n;j++)
    {
    fscanf(fn,"%d",&c[j]);
    printf("%4d",c[j]);
    }
    }
    }

    int CPMIN()// tim do dai duong di truc tiep MIN giua 2 dinh cuar Do thi .
    {
    int min=1000;
    int i,j;
    for(i=1;i<=n;i++)
    {
    for(j=1;j<=n;j++)
    {
    if(i!=j && c[j]<min)
    min=c[j];
    }
    }
    return min;
    }

    int init()
    {
    int i;
    cmin=CPMIN();
    best=20000;
    sum =0; a[1]=1;
    for(i=1;i<=n;i++)
    b=1;
    }

    void update()
    {
    int s = sum +c[a[n]][a[1]];
    if(s < best)
    {
    //Hanhtrinh();
    for(int i=1;i<=n;i++)
    T=a; // luu lai hanh trinh toi uu nhat hien thoi
    best=s; // luu lai Tong chi hanh trinh toi uu nhat hien thoi
    }
    }

    void Try(int i)// tim thanh pho thu i trong hanh trinh
    {
    int j;
    for(j=2; j<=n;j++)// duyet tat ca cac pan co the
    if(b[j] > 0 ) // thanh pho thu j chua dc chon
    {
    a=j;
    b[j]=0;
    sum = sum+c[a[i-1]][a];
    if (i==n) update();
    else if( sum + (n-i+1)*cmin< best)// chi di tiep neu nhu thoa man can.
    {
    dem++;
    Try(i+1);
    }
    b[j]=1;
    sum = sum-c[a[i-1]][a];
    }
    }

    void output()
    {
    int i;
    printf("\n\n\n\n Tong chi phi cua hanh trinh tot nhat la :: %3d",best);
    printf("\nHanh Trinh:\n");
    for(i=1;i<=n;i++)
    printf(" %3d ->",T);
    printf(" 1 ");
    }
    int main()
    {
    read_File();
    init() ;
    Try(2);
    output();
    getch();
    }
     
  3. All_Of_Love

    All_Of_Love Youtube Master Race

    Tham gia ngày:
    26/11/10
    Bài viết:
    57
    Vâng,cám ơn anh nhìu :))
    Các anh cho em hỏi thêm bài nay mà dùng danh sách móc nối thì làm kiểu gì ạ?
     
  4. All_Of_Love

    All_Of_Love Youtube Master Race

    Tham gia ngày:
    26/11/10
    Bài viết:
    57
    Các anh không ai giúp em giải bài toán này bằng danh sách móc nối à :(( Bài toán này nổi tiếng lắm mà :|
     

Chia sẻ trang này