回 帖 发 新 帖 刷新版面

主题:关于最短路径的问题

下面程序有错误 实在是找不出了 希望好心人能帮我看一下 真是无比感谢
#include <iostream.h>
#include <string.h>


class BuildGraph
{
    private:
        int n,m;
        int G[10][10],pt[10],j[10],k[10];                                  
    public:
        void SetGraph()
        {   
            int c=1;
            cout<<"请输入顶点数与边数(规定范围为1-9)"<<endl;
            cin>>n>>m;
               while(n>9&&n<=0&&m>9&&m<0)
            {
                cout<<"(规定范围为1-9,请重新输入)"<<endl;
                cout<<"请输入顶点数与边数(规定范围为1-9)"<<endl;
                cin>>n>>m;
               }
            cout<<"请输入"<<n<<"个顶点的值(请用1-9数字代替)"<<endl;
             for(int i=1;i<=n;i++)
            {
                 cin>>pt[i];
            }
            for(i=1;i<=m;i++)
            {
               cout<<"请输入第"<<i<<"条边的边头,边尾和权值(依次输入)"<<endl;
                   cin>>j[c]>>k[c];
                   cin>>G[j[c]][k[c]];
                   c++;
            }
        }
        void dijkstra()   
        {
            int l[10],t[10];                                    
            int i,f=1,min,minloc; 
            int a,z,x;
            int pre[10];
            cout<<"\n请输入起始点:";
            cin>>a;
            cout<<"\n请输入结束点:";
            cin>>z; 
            for(i=1;i<=9;i++)
            {
                if(i==a)    
                    l[i]=0; 
                else 
                    l[i]=10000;    
                   t[i]=i;            
            }
            while(f)
            {
                min=10000;          
                minloc=1;
                for(i=1;t[i]<=9;i++)
                {
                    if(t[i]>0) 
                        if(l[i]<min) 
                        {
                            min=l[i];      
                            minloc=i;           
                        }
                }
                t[minloc]=-1;                   
                if(minloc==z)                        
                      f=0;
                for(i=1;t[i]<=9;i++)                 
                    if(t[i]>0)                      
                    {
                        for(int c=1;c<=9;c++)          
                        {
                            if(j[c]==minloc||k[c]==i)    
                            {
                                if(G[minloc][i]!=0)
                                {
                                   x=i;                    
                                   if(l[x]>(l[minloc]+G[minloc][x]))  
                                   {
                                      pre[x]=minloc;           
                                      l[x]=l[minloc]+G[minloc][x];
                                   }
                                }
                            }
                        }
                    }      
            }
            cout<<"最短路径的长度是:"<<l[z]<<endl;  
            cout<<z; 
            while(pre[z]!=a) 
            {
                cout<<"<-"<<pre[z];
                z=pre[z];
            }
            cout<<"<-"<<a; 
        } 
};


void main()
{
    BuildGraph bg;
    bg.SetGraph();
    bg.dijkstra();
}

回复列表 (共1个回复)

沙发

while(n>9&&n<=0&&m>9&&m<0)
基本的循环语句出错!!!!
一个数大于大的小于小的,那他只有空集啊,意思你的while循环永远是不会被调用的,粗心啊,兄弟!!!! while(n>9&&n<=0&&m>9&&m<0) 应该改成 
while(n>9||n<=0||m>9||m<0),这样才不会出问题啊!!!!
void SetGraph()函数中第二个for循环中的i没有定义啊!!!
for(i=1;i<=m;i++)
            {
               cout<<"请输入第"<<i<<"条边的边头,边尾和权值(依次输入)"<<endl;
                   cin>>j[c]>>k[c];
                   cin>>G[j[c]][k[c]];
                   c++;
            }
你只在上面一个for循环中定义了i,那个i的有效范围只有在那一个循环中是有效的,因为你定义的是局部变量!!!还有数组的下标是从0开始的列如:k[0],k[1]......你的数组也太小了才10个万一别人多输入几个又会出现错误!!!要多注意,还有成员函数的代码最好在外部编写,不要在在类中编写,那样不好很难管理,简单的还过的去,复杂一点的你就麻烦了啊,呵呵!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册