Ai biết Thuật toán Dijkstra ko ?

Thảo luận trong 'Khoa Khoa Học Máy Tính' bắt đầu bởi root, 29 Tháng mười một 2010.

  1. Offline

    root

    • Thành Viên Mới

    Số bài viết:
    53
    Đã được thích:
    13
    Điểm thành tích:
    0
    Anh em ai biết Thuật toán Dijkstra ko , nhưng mình tìm đường đi bằng bảng ghi nhãn
    Cảm ơn
  2. Offline

    haihung_9x

    • Friends

    • Chém gió đỉnh cao
    Số bài viết:
    353
    Đã được thích:
    271
    Điểm thành tích:
    220
    Của bạn đây. Thao khảo đi.

    Mã:
    #include <stdio.h>
    #include <conio.h>
    #include <iostream.h>
    #define  max 5
    #define  maxpt 100
    int chuaxet[max], truoc[max],d[max];
    void nhapdt(int m[max][max],int n)
    {
    	int i,j;
    	for(i=0;i<n;i++)
    		for(j=0;j<n;j++)
    		{
    			cout<<"A["<<i<<"]["<<j<<"] =";
    			cin>>m[i][j];
    			cout<<endl;
    		}
    }
    void indt(int mt[max][max], int n)
    {
    	int i,j;
    	for(i=0;i<n;i++)
    	{
    		for(j=0;j<n;j++)
    			cout<<mt[i][j]<<"\t";
    			cout<<"\n"<<"\n";
    	}
    			cout<<endl;
    }
    
    void ktchuaxet(int n)
    {
    	for(int i=0;i<n;i++)
    		chuaxet[i]=1;
    }
    
    void dijkstra(int s,int m[max][max], int n)
    {
    	int T,u,min;
    	for(int v=0;v<n;v++)
    	{
    		d[v]=m[s][v];
    		truoc[v]=s;
    	}
    	d[s]=0;T=1;chuaxet[s]=0;
    	while (T<=n)
    	{
    		min=maxpt;
    		for(int i=1;i<n;i++)
    			if(chuaxet[i]&&d[i]<min)
    			{
    				min=d[i];
    				u=i;
    			}
    		chuaxet[u]=0;T++;
    		for (v=0;v<n;v++)
    			if (chuaxet[v]&&(d[v]>d[u]+m[u][v]))
    			{
    				d[v]=d[u]+m[u][v];
    				truoc[v]=u;
    			}
    	}
    }
    
    void main()
    {
    	int M[max][max],t;
    	clrscr();
    	int n;
    	cout<<"Nhap so dinh = ";cin>>n;
    	ktchuaxet(n);
    	nhapdt(M,n);
    	indt(M,n);
    	ktchuaxet(n);
    	dijkstra(0,M,n);
    	cout<<"\nNhap dinh can tim KC nho nhat den s: ";
    	cin>>t;
    	cout<<endl<<"KC nho nhat tu dinh 0 den "<<t<<" la: "<<d[t];
    	cout<<endl<<"Duong di la: "<<t<<"<-";
    	while(t!=0)
    	{
    		t=truoc[t];
    		cout<<t<<"<-";
    	}
    getch();
    }
  3. Offline

    trungqn1

    • Friends

    Số bài viết:
    390
    Đã được thích:
    162
    Điểm thành tích:
    240

Chia sẻ trang này

Advertising: Linux system admin | nukeviet | nukeviet 4 | Upload ảnh miễn phí